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)
到目前为止,我们可以收集:
如果以上是正确的,那么为什么以下代码无法编译(在MSVC2015中):
struct inj
{};
typedef struct inj::inj inj2;
Run Code Online (Sandbox Code Playgroud)
错误消息
错误C2039'{ctor}':不是'inj'的成员
似乎与标准不一致:
注意:例如,构造函数在详细类型说明符中不是可接受的查找结果,因此不会使用构造函数来代替inject-class-name. - 注意
由于以下代码在其他编译器中编译和运行正确,因此它是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.