我很想知道为什么上课'数据成员不能使用()语法初始化?请考虑以下示例:
#include <iostream>
class test
{
public:
void fun()
{
int a(3);
std::cout<<a<<'\n';
}
private:
int s(3); // Compiler error why???
};
int main()
{
test t;
t.fun();
return 0;
}
程序编译失败&amp;给出以下错误。
11 9 [Error] expected identifier before numeric constant
11 9 [Error] expected ',' or '...' before numeric constant
为什么呢?是什么原因?关于类数据成员初始化的C ++标准是什么意思? 非常感谢您的帮助。谢谢
答案 0 :(得分:11)
Early proposals leading to the feature's introduction解释this is to avoid parsing problems。
这里只是其中一个例子:
不幸的是,这使得“
(
表达式列表)
”的初始化程序在解析声明时形式不明确:struct S { int i(x); // data member with initializer // ... static int x; }; struct T { int i(x); // member function declaration // ... typedef int x; };
一种可能的解决方案是依赖现有规则,如果声明可以是对象或函数,那么它就是一个函数:
struct S { int i(j); // ill-formed...parsed as a member function, // type j looked up but not found // ... static int j; };
类似的解决方案是应用另一个现有规则,目前仅在模板中使用,如果
T
可能是某种类型或其他类型,那么它就是其他内容;如果我们真的是一个类型,我们可以使用“typename
”:struct S { int i(x); // unabmiguously a data member int j(typename y); // unabmiguously a member function };
这两种解决方案都引入了很多可能被许多用户误解的细微差别(comp.lang.c ++上的许多问题都证明了为什么“
int i();
”在块范围内没有声明默认值 - 已初始化int
)。本文中提出的解决方案是仅允许“
=
初始值设定项”和“{
初始值设定项列表的初始值设定项}
“形式。这解决了大多数情况下的歧义问题。 [..]