复制构造函数是否可行?

Jan*_*šil 2 c++ language-lawyer

考虑以下程序:

struct A {
  A(int){}
  A(A const &){}
};

int main() {
  A y(5);
}
Run Code Online (Sandbox Code Playgroud)

变量y使用表达式直接初始化5。重载分辨率选择构造函数A::A(int),这是我期望和想要的,但是为什么会发生呢?

可能是因为两个原因:

要么过载A::A(int)才是更好的匹配A::A(A const &),否则第二个根本不是可行的过载。

问题:在以上程序中,构造函数是否A::A(A const &)是可行的重载来初始化y

Qui*_*mby 6

是的,构造函数重载的规则与普通函数相同。如Ben Voigt所指出的,允许编译器对每个参数进行一次用户定义的转换,以使参数与参数匹配。在这种情况下,它可以int->A通过A(5)

这种情况与:

void foo(const std::string&);
void bar(const std::string&);//1
void bar(const char*);//2

//...
foo("Hello");//Is allowed
bar("Hello");//Calls 2 as it matches exactly without a need for conversion.
Run Code Online (Sandbox Code Playgroud)

因此,答案是肯定的,它是可行的重载,但未选择它,因为根据重载规则A(int)构造函数是更好的匹配。

  • @nwp因为int构造函数不是显式的,所以它是用户定义的从int到A对象的转换。这也许是混淆OP的原因 (4认同)