Sarvesh:
コードはでありcopy_initialization
struct A
{
operator int() { return 12;}
};
struct B
{
B(int) {}
};
int main()
{
....
A a;
B b0 = 12;
// B b1 = a; //< error: conversion from 'A' to non-scalar type 'B' requested
B b2{a}; // < identical, calling A::operator int(), then B::B(int)
B b3 = {a}; // <
auto b4 = B{a}; // <
}
今の質問です
- どのようB2の場合には直接の初期化作業をしますか?初期コール変換演算子を指示することはできますか?
- なぜコピーの初期化は、B1で失敗しますか?暗黙的にAはintに変換されなければならないとBのコンストラクタを呼び出すことができます。
- B3はまた、コピーの初期化であるが、それは動作します。なぜそうなのか?
ボーラ:
これは非常に簡単です:(ユーザー定義型用)暗黙の兌換はない推移 C ++でプロパティ。それは一方で、あるA
に変換可能であるint
、とint
するコンバーチブルでB
、これがないではない、それ自体でそれが意味A
に変換されますB
。そこから有効な暗黙の型変換配列であるA
のはB
、それほどA
に変換できませんB
。
コピー初期設定は、初期化式の型と初期化されているタイプの間の暗黙的な兌換が必要です。以来A
に変換できないB
、b1
コンパイルされません。
あなたが見る、いつでも{}
このような初期化の一環として、それが適用されるオブジェクトが初期化の他の形態は異なるプロセスであり、リストの初期化のいくつかのフォームを受けるために起こっていることを、この手段。
b2
「直接の初期化」を実行しません。これは、直接実行リストのリストの初期化の二つの形態の一つである初期化、。リストの初期化の規則は、この場合には、結局のコンストラクタのセットにオーバーロード解決を使用して煮詰めますB
。コンストラクタがあるB
と呼ばれることができA
、その呼び出しがの暗黙の型変換を経由して発生する可能性があるため、A
とはint
。
b3
「コピー初期設定」ではありません。それはコピーであるリストの「コピー初期設定」とは全く関係ありません初期化、。コピーリストの初期化は、直接リストの初期化をするために、どちらもこのような場合には適用され、正確に2つの例外と同じです。だから、同じことをしb2
。