根据标准等级/2:
…类名也被插入到类本身的范围中;这称为注入类名称.…。
此外,basic.cope./9:
注入类名的声明点(第9条)紧跟着类定义的开头大括号。
最后,basic.lookup.classref/3及其示例:
如果不合格id为~ 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
}到目前为止,我们可以收集到:
如果上面的内容是正确的,那么为什么以下代码无法编译(在MSVC2015中):
struct inj
{};
typedef struct inj::inj inj2;错误信息
错误C2039 '{ctor}':不是'inj‘的成员
似乎与标准不符:
注意:例如,构造函数不是精化类型说明符中可接受的查找结果,因此不会使用构造函数来代替注入的类名。-end注记
发布于 2015-08-02 09:34:09
由于以下代码在其他编译器中正确编译和运行,所以它是MSVC2015中的一个bug。
#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';
}更新:报告为臭虫。
https://stackoverflow.com/questions/31769853
复制相似问题