1

を使用した新しい初期化構文{...}の例をいくつか見つけました。しかし、例はかなり古いものです。クロスチェックしたいだけですが、現在の状況はまだ説明されているとおりですか?

すべてのコンテキスト(特にテンプレート)で、次のソースフラグメントは、どのようなものであっても、常にあいまいTではありませんv

  • T{v};--常にタイプの一時を構築しT、値で初期化しますv
  • T x{v};x--型の変数Tを値で初期化しましたv
  • T x = {v};-同じ=です。ここではオプションです。
  • T a[] = {v};--配列のすべての要素を値で初期化しますv
  • p = new T{v};--タイプのオブジェクトをTヒープに割り当て、値で初期化しますv

したがって、それは依然として真実であり、 「-syntaxを優先し、ソースコードは何あるかによって異なる意味を持つことはありません{}Tvと人々に伝えます。

4

1 に答える 1

6
  • T x{v};--タイプTの変数xを値vで初期化しました。
  • T x = {v};--同じです。=はここではオプションです。

N3291(最終規格の前の最後の作業ドラフト)に関する限り、これらはすべての可能なものvと同じではありませんT

主な違いは次のとおりです。1つ目は明示的なコンストラクター呼び出しであるため、宣言されたコンストラクターを選択できますexplicit。2つ目は、明示的なコンストラクター呼び出しではありません(コンストラクターを呼び出しますが)したがって、コンストラクターを選択することはできません。explicit

13.3.1.7から:

copy-list-initializationでは、候補関数はすべてTのコンストラクターです。ただし、明示的なコンストラクターが選択されている場合、初期化の形式は正しくありません。

これの目的は、構文explicitを使用している場合でも、コピーの初期化を使用するときに誤って値の変換を実行しないようにすることです。{}

于 2011-08-20T20:57:09.707 に答える