为什么不能使用"( )"为类的非静态数据成员提供默认值?

Why non-static data members of class cannot be given default values using '( )'?

本文关键字:数据成员 静态 默认值 不能 为什么      更新时间:2023-10-16

我只是在C++中浏览基本的OOP概念,并遇到了以下内容:

class A{
public:
int i(20); //line 1
};
int main()
{
int j(20);
cout<<j<<endl;
A obj;
cout<<obj.i<<endl;
}

编译时line1出现以下错误(在 gcc 和 MSVC++ 中都尝试过(,

expected identifier before numeric constant

我知道如何为non-static member分配默认值(可以从 C++11 开始以不同的方式完成(,但我无法理解为什么只有这种默认值初始化是不可能的,因为在其他任何地方进行相同的初始化(对于普通变量(是有效的。

这种限制的原因可能是什么?

编辑:

从提供的链接和答案来看,这是因为"在某些情况下,它可能读作函数声明。由于这种模棱两可,这是不允许的。

但请考虑以下情况:

//global scope
struct B{
int j;
};
int B = 10;
int object(B);

这也是一个类似的情况,其中int object(B)可以理解为将B object作为参数并具有int返回类型的函数object。 我在gcc中尝试过这个,MSVC++和对象被视为int variable.为什么在这种情况下不受限制?

使用括号被认为太混乱了,因为它读起来与函数声明非常相似。 考虑默认构造函数的情况:

class A{
public:
int i();  // function declaration -- did you mean to
// use the default constructor instead?
};

不过还有其他方法可以做到这一点:

class A{
public:
int i = 20;
int i{20};
int i = {20};
};