直接初期化とコピー初期化の違いを読んでいました(§8.5/12):
T x(a); //direct-initialization
T y = a; //copy-initialization
copy-initializationについて読んで理解したのは、アクセス可能で非明示的な copy-constructorが必要であるということです。そうしないと、プログラムがコンパイルされません。次のコードを書いて確認しました。
struct A
{
int i;
A(int i) : i(i) { std::cout << " A(int i)" << std::endl; }
private:
A(const A &a) { std::cout << " A(const A &)" << std::endl; }
};
int main() {
A a = 10; //error - copy-ctor is private!
}
GCC は次のようなエラー ( ideone )を返します。
prog.cpp:8: エラー: 'A::A(const A&)' は非公開です
これまでのところ、すべて順調で、ハーブ・サッターの言葉を再確認しました。
コピーの初期化とは、必要に応じて最初にユーザー定義の変換を呼び出した後、コピー コンストラクターを使用してオブジェクトが初期化されることを意味し、"T t = u;" の形式と同等です。
private
その後、キーワードにコメントを付けて copy-ctor にアクセスできるようにしました。さて、当然のことながら、次のものが印刷されることを期待しています。
A(定数 A&)
しかし驚いたことに、代わりにこれを出力します ( ideone ):
A(int i)
なんで?
わかりました。まず、を使用して、必要に応じてここで変換規則を適用して (§8.5/14)、その型から型の一時オブジェクトを作成し、次に copy-ctor を呼び出して を初期化することになっていることを理解しA
ました。しかし、そうではありませんでした。なんで?10
int
A(int i)
a
copy-constructor (§8.5/14) を呼び出す必要をなくす実装が許可されている場合、copy-constructor が宣言されているときにコードを受け入れないのはなぜprivate
ですか? 結局のところ、それはそれを呼んでいません。それは甘やかされて育った子供が、最初はいらいらして特定のおもちゃを要求し、あなたが彼に特定のおもちゃを与えると、あなたの後ろに捨ててしまうようなものです. :|
この動作は危険でしょうか? つまり、copy-ctor で何か他の便利なことをするかもしれませんが、それが呼び出されない場合、プログラムの動作は変更されませんか?