C 构造函数按值

C++ Constructor by Value

本文关键字:构造函数      更新时间:2023-10-16

假设我有以下(无效)代码:

struct A {
  A(A) {};
};

MSVC给我:

error C2652: 'A' : illegal copy constructor: first parameter must not be a 'A' 

为什么编译器将其检测为复制构造函数,而不是常规构造函数?

C 标准的第12.8.2章说:

类的非模板构造函数 X 如果其第一个参数为类型,则是复制构造函数 X& ,,,, const X& ,,,, 挥发性X& 或者 const挥发X&

我希望编译器将上述方法视为常规构造函数,就像

一样
struct A {
  A(B) {};
};

b是另一个类。

此行为在哪里定义?

n4140 [class.copy]/6

如果X类的构造函数的声明如果其第一个参数为type(可选为CV值)X,则没有其他参数,或者没有其他参数,或者其他所有参数都有默认参数。