gpt4 book ai didi

C++:调用哪个合适的构造函数:构造函数还是复制构造函数?

转载 作者:行者123 更新时间:2023-11-30 02:54:21 26 4
gpt4 key购买 nike

代码

class ElisionTest
{
public:
int n;
// ElisionTest(ElisionTest& other): n(other.n) {cout<<"copy constructor"<<endl;}
ElisionTest(int n): n(n) {cout<<"constructor"<<endl;}
};

int main(int argc, char const *argv[])
{
ElisionTest et = 10;

}

打印 "constructor" 没问题。现在,当我取消注释复制构造函数时,出现编译时错误:

cpp_test.cpp: In function 'int main(int, const char**)':
cpp_test.cpp:140:19: error: no matching function for call to 'ElisionTest::ElisionTest(ElisionTest)'
cpp_test.cpp:140:19: note: candidates are:
cpp_test.cpp:135:2: note: ElisionTest::ElisionTest(int)
cpp_test.cpp:135:2: note: no known conversion for argument 1 from 'ElisionTest' to 'int'
cpp_test.cpp:134:2: note: ElisionTest::ElisionTest(ElisionTest&)
cpp_test.cpp:134:2: note: no known conversion for argument 1 from 'ElisionTest' to 'ElisionTest& {aka ElisionTest&}'

这可能继续表明,这里将使用临时 ElisionTest(10) 调用复制构造函数。并且由于您不能对临时对象进行非常量引用,因此将复制构造函数的参数设置为 const& 应该可以解决错误。

但是,如果我修改复制构造函数以采用 const ElisionTest& 而不是 ElisionTest&,则不会出现错误并且输出为 "constructor"再次。为什么它不打印 "copy constructor"

最佳答案

ElisionTest(ElisionTest& other);

具有该签名的构造函数允许通过左值初始化 ElisionTest 实例。当您这样做时:

ElisionTest et = 10;

这将从临时构造一个 ElisionTest 的实例。您的代码相当于:

ElisionTest et = ElisionTest(10);

这将调用您的构造函数,该构造函数采用非常量引用并用它初始化 et。但是非常量引用不能绑定(bind)到临时引用。这就是为什么我们需要将 const 添加到您的复制构造函数,以便它可以同时支持左值和右值:

ElisionTest(ElisionTest const& other);
// ^^^^^

你看不到输出的原因是因为一个叫做 copy-elision 的东西.编译器可以省略对复制/移动构造函数的调用。在 GCC 中,您可以使用 -fno-elide-constructors 关闭复制省略。

关于C++:调用哪个合适的构造函数:构造函数还是复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17136578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com