c++ - 嵌套从属名称在成员初始化列表如何被分别解析为类型或数据成员?
巴扎黑
巴扎黑 2017-04-17 13:03:06
0
1
629

我在看 Effective C++ 第四十二条,它指出C++ 在解析嵌套从属名称(nested dependent name)时并不会优先假定它是「类型」,于是得显式地在所有嵌套从属类型名称前统统加上typename, 以声明它是嵌套从属类型名称(nested dependent type name)。但是typename不能用在成员初始化列表(member initialization list)里。问题来了:

假定varialble_Base的数据成员,类型为int. 那么

template class Derived: public Base { public: explicit Derived(int x) : Base::variable_(x) {} }

按照 C++ 的解析规则,Base::variable_应该会被优先解析成非类型的名称,即Base的一个数据成员,从而在Derived构造函数里被初始化成x.

但是这么一来,假定Base::Nested是一种 class, 则

template class Derived: public Base { public: explicit Derived(int x) : Base::Nested(x) {} private: int second_variable_; }

怎么还能保证Base::Nested(x)会调用Base::Nested(int x)构造函数来初始化其类对象,而不是把Base::Nested当成一种Base的数据成员呢?

巴扎黑
巴扎黑

membalas semua (1)
Peter_Zhu

我突然发现我把Base::Nested(x)Base的构造函数搞混了。Derived作为派生类,只能在成员初始化列表内,调用基类Base的构造函数,以及初始化它自己的数据成员。

如果Derived继承Base::Nested, 其实这就意味着Base::Nested是一个类,编译器会知道成员初始化列表里Base::Nested(int x)是一个构造函数的。其实 Effective C++ 第四十二条也指出了C++ 禁止在 base class lists 用typename, 毕竟本来就画蛇添足。

话说回来,在成员初始化列表内,要把Base::variable_解析成一个类型,也没有意义

    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!