コード
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 参照を持つことはできないため、コピー コンストラクターの引数を a にconst&
することでエラーが解決されるはずです。
しかし、コピー コンストラクターをのconst ElisionTest&
代わりに取得するように変更するElisionTest&
と、エラーは発生せず、出力は"constructor"
再び表示されます。なぜ印刷されなかったの"copy constructor"
ですか?