不明确的注入类名称不是错误

Arm*_*yan 19 c++ multiple-inheritance language-lawyer name-lookup

我在C++标准中读到的关于注入类名的内容与我将要提供的示例程序的行为相矛盾(我认为).这是我读到的:

  • 从3.4(第3段)

    为了名称隐藏和查找的目的,类的注入类名(第9节)也被认为是该类的成员.

  • 从9(第2段)

    在看到类名后立即将类名插入到作用域中.类名也插入到类本身的范围内; 这被称为注入类名.出于访问检查的目的,inject-class-name被视为公共成员名称.

从这些我了解到,以下是一个结构良好的翻译单元,它成功编译.

#include <vector>
class X: std::vector<int>
{
   vector mem;
};
Run Code Online (Sandbox Code Playgroud)

但是,我认为以下应该产生错误,但事实并非如此

#include <vector>
class X: std::vector<int>, std::vector<char>
{
   vector mem; //compiles OK... mem is apparently std::vector<int>
};
Run Code Online (Sandbox Code Playgroud)

由于名称vector被注入到两个std::vector<int>std::vector<char>作为仿佛公共成员名称,那么就应该通过X继承,因此,名称vectorX应该是明确的.我错过了什么吗?

PS我正在使用MSVC9.0

Arm*_*yan 15

我找到了!它就在标准中!我是正确的!它应该是模棱两可的!

第14.6.1条

查找注入类名(10.2)的查找在某些情况下可能会导致歧义(例如,如果在多个基类中找到它).如果找到的所有注入类名称都引用同一类模板的特化,并且如果名称后跟一个template-argument-list,则引用引用类模板本身而不是其特化,并且不是暧昧.[例:

template <class T> struct Base { };
template <class T> struct Derived: Base<int>, Base<char> 
{ 
    typename Derived::Base b; // error: ambiguous typename 
    Derived::Base<double> d;  // OK 
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

底线:这是另一个 Microsoft编译器BUG.禁用语言扩展也无济于事.