C++类名注入

Hec*_*tor 4 c++ language-lawyer c++11

根据标准[class]/2:

...类名也插入到类本身的范围内; 这被称为注入类名....

而且,[basic.scope.pdecl]/9:

注入类名(第9条)的声明点紧跟在类定义的开头括号之后.

最后,[basic.lookup.classref]/3及其示例:

如果unqualified-id是~ type-name,则查找type-name ...

struct A { };
struct B {
    struct A { };
    void f(::A* a);
};
void B::f(::A* a) {
    a-> ~ A(); // OK: lookup in *a finds the injected-class-name
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我们可以收集:

  1. 在A类的范围内,存在名称A.
  2. 该名称在A类定义括号的开头声明.
  3. 该名称命名一种类型.

如果以上是正确的,那么为什么以下代码无法编译(在MSVC2015中):

struct inj
{};

typedef struct inj::inj inj2;
Run Code Online (Sandbox Code Playgroud)

错误消息

错误C2039'{ctor}':不是'inj'的成员

似乎与标准不一致:

注意:例如,构造函数在详细类型说明符中不是可接受的查找结果,因此不会使用构造函数来代替inject-class-name. - 注意

Hec*_*tor 6

由于以下代码在其他编译器中编译和运行正确,因此它是MSVC2015中的错误.

#include <boost/type_index.hpp>
#include <iostream>

struct inj
{
    int g;
};

typedef struct inj::inj inj2;

int main()
{

    inj2 ii;
    std::cout << boost::typeindex::type_id_with_cvr<decltype(ii)>().pretty_name() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

更新:报告为bug.