コンパイル(G ++の下で)し、次のコードを実行すると "Foo :: Foo(int)"が出力されます。ただし、コピーコンストラクタと代入演算子をプライベートにした後、次のエラーでコンパイルできません。 "エラー: 'Foo :: Foo(const Foo &)'はプライベートです。実行時に標準コンストラクタを呼び出すだけの場合、コピーコンストラクタはどのように必要ですか?コンストラクタのアクセス規則
#include <iostream>
using namespace std;
struct Foo {
Foo(int x) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo& operator=(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}
};
int main() {
Foo f = Foo(3);
}
コピーコンストラクタを使用すると主張する場合、なぜそれが出力に表示されませんか。オリジナルのポスターは、:: Foo(int)のみが呼び出されたことを明確に示しました。 – KIV
@ Neilしかし、コピーコンストラクタは何かを明確にしているので、コンパイラがそれを最適化する可能性は低いです... –
@Matthew:いいえ、標準では、コンパイラは単にそのような呼び出しを最適化して、副作用。その塩の価値がある現代のコンパイラ*はこの呼び出しを最適化します。一方、標準では、呼び出しが依然として可能でなければならないことも明確に述べられています。したがって、Neilの説明は正しいし、その点まである。 –