为什么不能通过直接初始化语法初始化类数据成员?

时间:2015-02-24 13:05:11

标签: c++ initialization language-lawyer

我很想知道为什么上课'数据成员不能使用()语法初始化?请考虑以下示例:

#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 ++标准是什么意思? 非常感谢您的帮助。谢谢

1 个答案:

答案 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)。

     

本文中提出的解决方案是仅允许“= 初始值设定项”和“{ 初始值设定项列表的初始值设定项}“形式。这解决了大多数情况下的歧义问题。 [..]