程序员可能想知道为什么类数据成员不能使用直接初始化语法赋值,类似于本地初始化语法变量可以。考虑以下示例:
class test { public: void fun() { int a(3); std::cout << a << '\n'; } private: int s(3); // Compiler error: Why??? };
编译此代码时,会出现错误:
11 9 [Error] expected identifier before numeric constant 11 9 [Error] expected ',' or '...' before numeric constant
为什么会出现这种情况?让我们回顾一下 C 标准对类数据成员初始化的立场。
直接初始化语法的早期提案解释说,它被排除是为了防止解析问题。例如,考虑以下代码:
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(x);作为带有初始值设定项的数据成员或带有参数的成员函数声明。
一种解决方案是依赖以下规则:如果声明可以解释为对象和函数,应该将其视为函数。然而,块作用域声明已经存在此规则,导致潜在的混乱:
struct S { int i(j); // ill-formed...parsed as a member function, // type j looked up but not found // ... static int j; };
另一个解决方案是使用以下规则:如果声明可以解释为类型和其他内容,则它应该应视为后者。同样,模板已经存在此规则:
struct S { int i(x); // unabmiguously a data member int j(typename y); // unabmiguously a member function };
但是,这两种解决方案都引入了容易产生误解的微妙之处。
为了解决这些歧义, C 标准建议仅允许以下形式的初始化器:
这解决了中的歧义大多数情况下,避免需要额外的规则。
总而言之,C 中禁止对类数据成员直接初始化语法源于解析涉及数据成员和数据成员的复杂数据结构声明期间可能出现的歧义。具有相似签名的函数声明或类型定义。
以上是为什么不能使用直接初始化语法在 C 中初始化类数据成员?的详细内容。更多信息请关注PHP中文网其他相关文章!