0

Visual Studio 2013 と C++ コンパイラを使用して、さらに別のリンク リストを記述し、試行錯誤によってこれに遭遇しました。これは Visual C++ 固有のものですか、それとも標準の一部ですか?

私はこの構文がとても好きです。とてもきれいです。リンクされたリスト lib を作成したことがある場合は、気が付く前にポインターを追いかけて、脳が結び目を作ることができます。ただし、この構文は非常に明確です。

静的な初期化子の値を持つこのようなものがたくさんありますが、関数の引数を初期化子として使用していますか? それはまだ見ていません。

GCC C/C++ コンパイラが期待どおりの結果を生成するかどうかを知っておくと安心できます。誰?

typedef struct link_in_list {
    struct link_in_list *next;
    int32_t key;
    int32_t value;
}   LINK, *pLINK;

// ----------------------------------------------------------------------------
pLINK prepend_list(pLINK head, int32_t key, int32_t value)
{
    if (NULL == head)   {
        // initialize with a constant, variable, and expression
        return new LINK{ NULL, key, (key * key) };
    }   else    {
        // initialize with stack variables
        return new LINK{ head, key, value };
    }
}
4

1 に答える 1

6

これはリストの初期化と呼ばれ、C++11 で導入されました。私が指摘したい多くの点で、直接の初期化とは異なります。

int x{3.5}; // illegal - narrowing
int x(3.5); // fine, x is 3, but does this make sense?

T fun(); // this is a function returning a T
T fun{}; // this is a default constructed object
         // of type T

 std::vector<int> v(10, 20); // 10 elems: 20, 20, 20, ..., 20
 std::vector<int> v{10, 20}; // 2 elems: 10, 20

ただし、これらのケース以外では、直接初期化と非常に似ています。いいえ、問題のコンパイラが新しい言語標準をサポートしている限り、コンパイラ固有ではありません。

機能の追加の 1 つTは、「集合体」(つまり、配列、またはプライベート/保護されたメンバー、ユーザー提供のコンストラクター、基本クラス、仮想メソッドを持たないクラス型) の場合、リストの初期化は次のとおりです。集約の初期化に相当します。

あれは:

struct Foo {
    int a;
    char b;
    double c;
};

int i = 1;
char c = 'b';
double d = 42.;

Foo f{i, c, d};
Foo g = {i, c, d};

これらの行は同等です。

于 2015-01-16T03:34:50.310 に答える