是否使用变量编译器特定的新结构{}的列表初始化?

0 c++ c++11 list-initialization

使用Visual Studio 2013和C++编译器编写另一个链接列表并通过反复试验发生.这是特定于Visual C++还是标准的一部分?

我真的很喜欢这种语法.它非常干净.如果你已经写过一个链表lib,你知道你可以追逐指针,直到你的大脑被打结.这种语法虽然很清楚.

很多这样的东西都有静态初始化值,但是使用函数args作为初始化器?还没有看到.

知道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 };
    }
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 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
Run Code Online (Sandbox Code Playgroud)

但在这些情况之外,它与直接初始化非常相似.所以不,它不是特定于编译器的 - 只要有问题的编译器支持新的语言标准.

功能中的一个附加功能是if 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};
Run Code Online (Sandbox Code Playgroud)

那些线是等价的.

  • 这是如何解决我的问题的?我没有看到任何变量用作初始化器.我的struct {}是POD,而不是vector. (2认同)