Is struct A { int a[2] = {1, 2}; }; legal as per C++11?
Is struct A { int a[2] = {1, 2}; }; legal as per C++11?
clang 3.4接受以下代码
struct A
{
int a[2] = {1, 2};
};
然而,vc++ 2014 CTP拒绝它,并给出一个错误消息:
error C2536: 'A::A::a': cannot specify explicit initializer for arrays
哪个编译器是正确的?
是的,这是合法的,但是vc++不支持这个特性。它是类内成员初始化的统一初始化。
当然,=
符号是可选的,您的代码与以下代码相同:
struct A
{
int a[2] {1, 2};
};
是的,c++ 11允许这样做(但这是新的)。具体来说,在c++ 03中,类成员的语法是(§9.2):
<我> member-declarator: 我>
声明符opt
说明符constant-initializer <子>选择子>
<我> constant-initializer:
我>= constant-expression
唯一允许的原位初始化式是常量表达式。然而,在c++ 11中,语法发生了变化(仍然是§9.2):
<我> member-declarator: 我>
声明符virt-specifier-seqopt pure-specifieropt
说明符brace-or-equal-initializer <子>选择子>
这通常允许"大括号或等号初始化式",而不是像c++ 03中要求的那样限制为常量表达式。
相关文章:
- DrawIndexedInstanced 具有不同的 Index Count per Instance (Directx
- 如何做 boost::asio::spawn 与 io_service-per CPU.
- 为整个Markdown文档设置默认的PER代码语言
- D3D11中没有三个组件8bits-per-per-per-per-per-per-per-per-dxgi纹理格式
- "State pattern" vs "one member function per state" ?
- 具有 SVM、EM 和其他具有"weights per sample"的方法的库,例如
- vec.erase(vec.end()); Legal?
- Visual Studio 2013 中"per file"自定义生成步骤在哪里?
- 是通用基类Legal
- Is struct A { int a[2] = {1, 2}; }; legal as per C++11?
- 将 int** 转换为"pointer to a two-dimensional array of integers with fixed number of elements per column"