此常见问题解答涉及聚合和POD,并涵盖以下材料:
我有以下代码:
#include <iostream>
#include <vector>
struct C {
int a;
C() : a(0) {}
C(int a) : a(a) {}
};
std::ostream &operator<<(std::ostream &os, const C &c) {
os << c.a;
return os;
}
using T = std::vector<C>;
int main() {
auto v = T({5});
for (const auto &a : v) {
std::cout << a << ", ";
}
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用 g++,它会打印:
#include <iostream>
#include <vector>
struct C {
int a;
C() : a(0) {}
C(int …Run Code Online (Sandbox Code Playgroud) c++ vector initializer-list compiler-specific direct-initialization
在C和C++中,可以使用大括号初始化数组和结构:
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
Run Code Online (Sandbox Code Playgroud)
然而,在2007年的一次演讲中,Bjarne提到这种语法也适用于标量.我尝试过这个:
int i = {7};
Run Code Online (Sandbox Code Playgroud)
它确实有效!允许使用大括号初始化标量的原理是什么?
注意:我特别不是在谈论C++ 11统一初始化.这是很好的旧C89和C++ 98.
在下面的代码中,struct A有两个构造函数:A(int)和A(std::initializer_list<char>)。然后使用以下命令创建该结构的对象A({0}):
#include <initializer_list>
struct A {
int a;
constexpr A(int) { a = 1; }
constexpr A(std::initializer_list<char>) { a = 2; }
};
static_assert( A({0}).a == 2 );
Run Code Online (Sandbox Code Playgroud)
事实证明,GCC 和 Clang 更喜欢这里的构造函数initializer_list(尽管int必须在 中转换参数char)并且整个程序被接受,但 MSVC 选择A(int)构造函数,导致static_assert. 演示: https: //gcc.godbolt.org/z/qx7W417Mv
这里是哪个编译器?