-1
struct A
{
    int a = 8; // VC++ 2012 rejects this.
};

我认为上面的代码比下面的合法代码更方便,更有表现力:

struct A
{
    A();

    int a;
};

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

我相信在 C++ 语言中添加新特性的最强烈动机之一是让 C++ 更具表现力。

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

4

2 回答 2

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不再是聚合,但它也不会与用户提供的构造函数为一。

于 2013-02-14T23:45:53.030 回答
2

C++11 支持Default Member Initialization.

§ 12.6.2

9 如果给定的非静态数据成员同时具有大括号或等式初始化器和内存初始化器,则执行内存初始化器指定的初始化,并且非静态数据成员的大括号或等式初始化器被忽略。[示例:给定

struct A {
  int i = /* some integer expression with side effects */ ;
  A(int arg) : i(arg) { }
  // ...
};

A(int) 构造函数将简单地将 i 初始化为 arg 的值,并且 i 的大括号或相等初始化器中的副作用不会发生。—结束示例]

您可以通过以下方式初始化成员:

struct A
{
    int a = 8; 
    int b{3}; // OR
};

如果将构造函数定义为 initialize a,b,则构造函数初始化列表会覆盖默认值。

I just wonder why VC++ 2012 not support this?

VS2012 还没有实现。

于 2013-02-14T23:56:27.890 回答