プリミティブ型の場合はどちらも同等ですが、違いがあるのはユーザー定義のクラス型です。どちらの場合も、実行されるコードは同じですが (基本的な最適化が実行された後)、初期化元の要素が構築している型でない場合、型の要件は異なります。
copy-initialization ( ) は、暗黙的に からに変換さT t = u;
れた一時的な型からのコピー構築と同等です。一方、直接初期化は、適切なコンストラクターへの直接呼び出しと同等です。T
u
t
ほとんどの状況では違いはありませんが、 を受け取るコンストラクターu
が宣言されているexplicit
か、コピー コンストラクターにアクセスできない場合、コピーの初期化は失敗します。
struct A {
explicit A( int ) {}
};
struct B {
B( int ) {}
private:
B( B const & );
};
int main() {
A a(1); // ok
B b(1); // ok
// A a2 = 1; // error: cannot convert from int to A
// B b2 = 1; // error: B( B const & ) is not accessible
}
歴史的な背景として、最初はプリミティブ型をcopy-initializationで初期化する必要がありました。*initializer-list* が言語に追加されてクラスのメンバー属性を初期化したとき、プリミティブ型はクラスと同じ構文で初期化して、初期化子リストの構文を均一かつ単純に保つ必要があると判断されました。同時に、コピー初期化によるクラスの初期化を許可することで、ユーザー定義型をプリミティブ型に近づけることができます。2 つの初期化形式の違いは当然のことです。は からへint a = 5.0;
の変換として処理され、次に から が初期化されます。同じことがユーザー定義型にも当てはまります。5.0
int
a
int
T u = v;
v
からへの変換として処理され、その変換された値からT
のコピー構築が行わu
れます。