C++构造函数的值

tob*_*spr 7 c++ language-lawyer

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

struct A {
  A(A) {};
};
Run Code Online (Sandbox Code Playgroud)

MSVC给了我:

error C2652: 'A' : illegal copy constructor: first parameter must not be a 'A' 
Run Code Online (Sandbox Code Playgroud)

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

C++标准的第12.8.2章说:

如果第一个参数的类型为X& , const X& , volatile X&const volatile X&,则类X的非模板构造函数是一个复制构造 函数.

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

struct A {
  A(B) {};
};
Run Code Online (Sandbox Code Playgroud)

而B是另一类.

这种行为在哪里定义?

cpp*_*ner 5

N4140 [class.copy]/6

如果一个类的构造函数X的第一个参数是类型(可选择cv-qualified)X并且没有其他参数,或者所有其他参数都有默认参数,那么它的构造函数声明是错误的.