たとえば、私はこれを書くことはできません:
class A
{
vector<int> v(12, 1);
};
私はこれしか書くことができません:
class A
{
vector<int> v1{ 12, 1 };
vector<int> v2 = vector<int>(12, 1);
};
C ++ 11言語設計の違いに関する考慮事項は何ですか?
考えられる理由の1つは、括弧を許可すると、すぐに最も厄介な解析に戻ることです。以下の2つのタイプを検討してください。
struct foo {};
struct bar
{
bar(foo const&) {}
};
これで、bar
初期化するタイプのデータメンバーがあるので、次のように定義します。
struct A
{
bar B(foo());
};
しかし、上記で行ったB
ことは、bar
値によってオブジェクトを返すという名前の関数を宣言し、署名を持つ関数である単一の引数を取りますfoo()
(を返し、foo
引数を取りません)。
この問題を扱うStackOverflowで尋ねられる質問の数と頻度から判断すると、これはほとんどのC ++プログラマーが驚くべき直感的ではないと感じるものです。新しい中括弧または等しい初期化子構文を追加することは、このあいまいさを回避し、白紙の状態から始めるチャンスでした。これが、C ++委員会がそうすることを選択した理由である可能性があります。
bar B{foo{}};
bar B = foo();
上記の両方の行は、予想どおりB
、タイプという名前のオブジェクトを宣言していますbar
。
上記の当て推量とは別に、上記の例では2つの大きく異なることを行っていることを指摘したいと思います。
vector<int> v1{ 12, 1 };
vector<int> v2 = vector<int>(12, 1);
最初の行は初期化するv1
2つの要素を含むベクターに、12
および1
。2つ目は、それぞれがに初期化さv2
れた12
要素を含むベクトルを作成し1
ます。
この規則に注意してください。型がをとるコンストラクターを定義している場合、型の初期化子がbraced-init-listの場合、initializer_list<T>
そのコンストラクターが常に最初に考慮されます。他のコンストラクターは、を取っているコンストラクターがinitializer_list
実行可能でない場合にのみ考慮されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加