0

使用 Visual Studio 2013 和 C++ 编译器编写另一个链表,并在此过程中反复试验。这是特定于 Visual C++ 还是标准的一部分?

我真的很喜欢这种语法。它超级干净。如果您在不知不觉中编写了一个链表库,您可以四处寻找指针,直到您的大脑陷入困境。这个语法虽然很清楚。

很多这些东西都有静态初始化值,但是使用函数 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 };
    }
}
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

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

功能的一个补充是,如果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 回答