struct A
{
int a = 8; // VC++ 2012 rejects this.
};
我觉得上面的代码更方便,比法定代码更具表现如下:为什么VC++ 2012不支持在其定义中指定类成员的默认值?
struct A
{
A();
int a;
};
A::A()
: a(8)
{}
我认为最强的动机之一添加新功能到C++语言使C++更传神。
我只是想知道为什么VC++ 2012不支持这个?
struct A
{
int a = 8; // VC++ 2012 rejects this.
};
我觉得上面的代码更方便,比法定代码更具表现如下:为什么VC++ 2012不支持在其定义中指定类成员的默认值?
struct A
{
A();
int a;
};
A::A()
: a(8)
{}
我认为最强的动机之一添加新功能到C++语言使C++更传神。
我只是想知道为什么VC++ 2012不支持这个?
C++ 11支持Default Member Initialization
。
§12.6.2
9如果给定的非静态数据成员既具有 支架 - 或等于初始值设定和MEM-初始化,由MEM-指定的初始化 初始化器被执行,并且非静态数据 成员的括号或等于初始值设定项被忽略。 [实施例:鉴于
struct A {
int i = /* some integer expression with side effects */ ;
A(int arg) : i(arg) { }
// ...
};
的A(int)构造将简单地初始化i到精氨酸, 的值和副作用在我的大括号或-equalinitializer不会采取 地方。例如末端]
您可以通过初始化成员:如果定义构造函数
struct A
{
int a = 8;
int b{3}; // OR
};
初始化a,b
,构造函数初始化列表替换缺省值。
I just wonder why VC++ 2012 not support this?
VS2012还没有实现它。
编辑这回答了原来的问题,“为什么C++不支持......”
实际上,由于C++ 11,在声明中对非静态数据成员的初始化支持:
struct A
{
int a = 8; // perfectly legal C++
};
#include <iostream>
int main()
{
A a1;
std::cout << a1.a << "\n";
}
输出:8.
这将初始化数据成员A::a
至8,并具有暗示A
不再是一个聚集体,但是它不会是一个与第用户提供的构造函数。
你能描述那个构造的语义吗? – 2013-02-14 23:47:01
VC++ 2012拒绝。你能把我引向C++规范的页面吗? – xmllmx 2013-02-14 23:47:19
@xmllmx那么你应该问“为什么VC++ 2012不支持...“ – juanchopanza 2013-02-14 23:50:32
C++ 11确实支持这个! – billz 2013-02-14 23:46:21
VC++ 2012拒绝了。 – xmllmx 2013-02-14 23:50:01
“为什么VC++ 2012不支持这个?”这是一个没有人能够回答MS的人的问题。 – us2012 2013-02-14 23:52:14