为什么允许在类外指定默认值但不允许在类内部指定默认值?

5
#include <atomic>
std::atomic<int> outside(1);
class A{
  std::atomic<int> inside(1);  // <--- why not allowed ?
};

错误:

prog.cpp:4:25: error: expected identifier before numeric constant
prog.cpp:4:25: error: expected ',' or '...' before numeric constant

在VS11中

C2059: syntax error : 'constant'

尝试内部 = std::atomic<int>(0); - user744186
我认为在类内部使用 () 存在一个历史问题。你尝试过使用等号 = 替代大括号吗? - iammilind
@iammilind 猜猜看,它在外面能用但在里面不能用…… - user34537
relatedother one - iammilind
1个回答

8

班内初始化器不支持初始化的(e)语法,因为设计它的委员会成员担心可能存在歧义(例如,众所周知的T t(X());声明是含糊不清的,没有指定初始化而是声明具有无名参数的函数)。

你可以这样说

class A{
    std::atomic<int> inside{1};
};

或者可以在构造函数中传递一个默认值。

class A {
  A():inside(1) {}
  std::atomic<int> inside;
};

2
尽管目前gcc和VC11都不支持{1},但是这个代码还是正确的。+1 - user34537
1
非静态数据成员初始化器(N2756)由Clang 3.0及以上版本支持。 - Matthieu M.
@MatthieuM。我在使用Windows :(. 我最喜欢的IDE是VS,我也喜欢clang,但它不支持Windows。 - user34537
@acidzombie24:实际上不是,我正在Windows上编辑,并使用VirtualBox在主机操作系统和客户操作系统之间共享文件夹的功能来从Ubuntu VM内部访问文件以进行编译 :) - Matthieu M.
1
这是C++11语法,目前还没有被许多编译器支持。 - Pete Becker
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接