オブジェクトを構築するとき()
との違いは何{}
ですか?
{}はinitializer_list
または配列のみをサポートする必要があると思いますが、snipの下で実行すると、混乱します。
#include <iostream>
using namespace std;
struct S {
int v=0;
S(int l) : v(l) {
}
};
int main()
{
S s1(12); // statement1
S s2{12}; // statement2
cout << s1.v << endl;
cout << s2.v << endl;
}
statement1
()
オブジェクトを構築するための基本的な文法であるため、正しいです。
statement2
コンパイルに失敗すると思います。{}
配列またはinitializer_list
型にのみ使用できると思います。しかし、実際の結果はエラーなしで完全にコンパイルされます。
私は何を間違えますか?
の場合S
、同じ効果があります。どちらもコンストラクターS::S(int)
を呼び出してオブジェクトを初期化します。
S s2{12};
リストの初期化と見なされます(C ++ 11以降)。S
集約型ではないといないstd::initializer_list
、とはコンストラクタの撮影を持っていないstd::initializer_list
、その後、
前のステージで一致が生成されない場合、のすべてのコンストラクターは
T
、非ナロー変換のみが許可されるという制限付きで、braced-init-listの要素で構成される引数のセットに対するオーバーロード解決に参加します。
そしてあなたはそれを考えました
{}
配列またはinitializer_list
型にのみ使用できると思います。
本当じゃない。リスト初期化の効果は、たとえば、S
が集約タイプの場合、集約初期化が実行されることです。場合S
の専門であるstd::initializer_list
、それは次のように初期化されますstd::initializer_list
。S
をとるコンストラクターがある場合std::initializer_list
、初期化に使用することが優先されます。詳細については、リンク先のページを参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加