编码
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)
. 并且由于您不能对临时对象进行非常量引用,因此将复制构造函数的参数设为 aconst&
应该可以解决该错误。
但是,如果我将复制构造函数修改为 takeconst ElisionTest&
而不是ElisionTest&
,则没有错误,并且输出"constructor"
再次出现。为什么不打印"copy constructor"
?