为什么编译器会抛出“预期的类型说明符”?

luk*_*r3k 2 c++ initialization class datamember visual-studio

class A
{
private:
   int a;

public:
   int get_a()
   {
      return a;
   }
   A(int mode)
   {
      a = 0;
   }
   A()
   {
      a = 5;
   }
};

class B
{
public:
   A b(0);   
};

class C
{
   int c;

public:
   C(int mode)
   {
      c = 0;
   }
   C()
   {
      c = 1;
   }
};

int main()
{
   B bb;
   C cc(0);
   //cout << bb.b.get_a();
   system("pause");
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在 B 类中的 b 上使用 () 括号它会在我切换到 {} 时出现错误,一切都很好。我的问题是不应该允许我这样做,因为在 main 中的 cc 上它不会给出任何错误。我允许在初始化对象时使用 () 括号。

Vla*_*cow 5

根据 C++ 20 标准(11.4 类成员),您可以使用大括号或等号初始化器来初始化类的数据成员

member-declarator:
    ...
    declarator brace-or-equal-initializeropt
Run Code Online (Sandbox Code Playgroud)

所以你可以使用

class B
{
public:
   A b = 0;   
};
Run Code Online (Sandbox Code Playgroud)

或者

class B
{
public:
   A b { 0 };   
};
Run Code Online (Sandbox Code Playgroud)

这允许避免函数声明的歧义。