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)
这称为列表初始化,并在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)
那些线是等价的.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |