次の例を検討してください。
#include <cstdlib>
struct A
{
A(int, char*){};
A(const A&){ printf("copy-ctor\n"); }
};
int main()
{
A x = A(5, nullptr);
}
8.5.16 (C++11 標準の) によると、次の行
A x = A(5, nullptr);
として扱われます
A x(A(5, nullptr));
(つまり、タイプ A の一時オブジェクトが作成され、タイプ A の copy-ctor に渡されて x が初期化されます)。次に、12.8.31 に従って、コンパイラーは「コピー省略」と呼ばれる最適化を実行して、型 A の一時的な作成を排除し、そのコード行を効果的に
A x(5, nullptr);
(つまり、一時的に作成されず、copy-ctors が呼び出されません)。
ここで、上記の例で次のようにリストの初期化を使用するとします。
A x = {5, nullptr}; // (1)
また
A x = A{5, nullptr}; // (2)
(1)および/または(2)が常に(つまり、コンパイラが「コピー省略」最適化を実行できる場合だけでなく)
A x(5, nullptr);
(つまり、A の最初のコンストラクターが直接呼び出され、一時オブジェクトは作成されず、型 A のオブジェクトのコピーは実行されません)。