2013-02-14 53 views
-1
struct A 
{ 
    int a = 8; // VC++ 2012 rejects this. 
}; 

我觉得上面的代码更方便,比法定代码更具表现如下:为什么VC++ 2012不支持在其定义中指定类成员的默认值?

struct A 
{ 
    A(); 

    int a; 
}; 

A::A() 
    : a(8) 
{} 

我认为最强的动机之一添加新功能到C++语言使C++更传神。

我只是想知道为什么VC++ 2012不支持这个?

+0

C++ 11确实支持这个! – billz 2013-02-14 23:46:21

+0

VC++ 2012拒绝了。 – xmllmx 2013-02-14 23:50:01

+1

“为什么VC++ 2012不支持这个?”这是一个没有人能够回答MS的人的问题。 – us2012 2013-02-14 23:52:14

回答

2

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还没有实现它。

2

编辑这回答了原来的问题,“为什么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不再是一个聚集体,但是它不会是一个与第用户提供的构造函数。

+0

你能描述那个构造的语义吗? – 2013-02-14 23:47:01

+0

VC++ 2012拒绝。你能把我引向C++规范的页面吗? – xmllmx 2013-02-14 23:47:19

+1

@xmllmx那么你应该问“为什么VC++ 2012不支持...“ – juanchopanza 2013-02-14 23:50:32