12

C および C++ では、中かっこを使用して配列と構造体を初期化できます。

int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};

ただし、2007 年の講演で、Bjarne はこの構文がスカラーにも有効であると述べています。私はそれを試してみました:

int i = {7};

そして、それは実際に機能します!中括弧を使用してスカラーの初期化を許可する理由は何ですか?

注: 特にC++11 の均一な初期化について話しているわけではありません。これは古き良き C89 と C++98 です。

4

3 に答える 3

4

根拠は言及されていませんが、2005 C++ 標準ドラフト8.5 Initializers [dcl.init]節 14 から

T がスカラー型の場合、フォームの宣言は次 T x = { a }; と同等です。 T x = a;

C++ 98 標準では、 copy-initialization のブレース初期化子のみが許可さT x = { a }れ、直接の初期化T x { a }では許可されないことに注意してくださいT x(a)

更新:この質問も参照してください

于 2013-01-09T09:54:34.417 に答える
4

中括弧を使用してスカラーの初期化を許可する理由は何ですか?

intポッドです。そのため、中括弧の初期化はint、初期化構文を他の POD と一致させるため、(およびすべての組み込み型に対して) 許可されます。

また、C++11 Uniform Initialization Syntax の背後にある理論的根拠が何であれ、C++03 で許可されているこの構文にも (部分的に) 適用できると思います。C++03 がこれを拡張して、標準コンテナーなどのポッド以外のタイプを含めなかっただけです。

この初期化が C++03 で役立つ場所が 1 つあります。

template<typename T>
void f()
{
    T  obj = { size() } ; //T is POD: built-in type or pod-struct
    //code
}

structこれで、適切なメンバーと任意の算術型で始まるインスタンスを作成できます。

struct header
{ 
    size_t size; //it is the first member
    //...
};

f<header>(); //body becomes : header obj = { size(); }; which is fine
f<size_t>(); //body becomes : size_t obj = { size(); }; which is fine

また、構造体であれ組み込み型であれ、POD は次のように一様に初期化できることにも注意してください。

header h = header(); //value-initialized
int    i = int();    //value-initialized

その理由の 1 つは一貫性だと思います。

于 2013-01-09T09:41:45.527 に答える