使用Visual Studio 2013和C++编译器编写另一个链表,并通过反复试验发生了这种情况。这是特定于视觉C++还是标准的一部分?
我真的很喜欢这种语法。超级干净。如果你在知道之前就写了一个链表库,你可以四处追逐指针,直到你的大脑打结。这种语法虽然非常清晰。
很多带有静态初始值设定项值的东西,但使用函数参数作为初始值设定项?还没见过。
知道 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 };
}
}
称为列表初始化,在 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
但在这些情况之外,它与直接初始化非常相似。所以不,它不是特定于编译器的 - 只要有问题的编译器支持新的语言标准。
功能上的一个补充是,如果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};
这些行是等效的。