首页 > 后端开发 > C++ > 正文

为什么不能使用直接初始化语法在 C 中初始化类数据成员?

Linda Hamilton
发布: 2024-11-17 16:10:02
原创
245 人浏览过

Why can't I initialize class data members in C   using direct initialization syntax?

为什么在 C 语言中禁止使用直接语法初始化类数据成员

程序员可能想知道为什么类数据成员不能使用直接初始化语法赋值,类似于本地初始化语法变量可以。考虑以下示例:

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 标准建议仅允许以下形式的初始化器:

  • =initializer-clause
  • {initializer-list }

这解决了中的歧义大多数情况下,避免需要额外的规则。

总而言之,C 中禁止对类数据成员直接初始化语法源于解析涉及数据成员和数据成员的复杂数据结构声明期间可能出现的歧义。具有相似签名的函数声明或类型定义。

以上是为什么不能使用直接初始化语法在 C 中初始化类数据成员?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板