根据标准[class]/2:
…类名也被插入到类本身的范围中;这被称为注入类名.…
此外,[basic.scope.pdecl]/9:
声明要点注入类名(第 9 条)紧跟在类定义的左大括号之后。
最后,[basic.lookup.classref]/3 及其示例:
如果 unqualified-id 是 ~类型名称, the 类型名称被查找……
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
}
到目前为止,我们可以收集到:
- 在类 A 的范围内,存在一个名称 A。
- 该名称在类 A 的定义大括号的开头声明。
- 该名称命名了一种类型。
如果以上正确的话为什么下面的代码无法编译(在 MSVC2015 中):
struct inj
{};
typedef struct inj::inj inj2;
错误信息
错误 C2039“{ctor}”:不是“inj”的成员
似乎与标准不一致:
注意:例如,构造函数不是详细类型说明符中可接受的查找结果,因此构造函数不会就地使用
注入的类名。 ——尾注
由于以下代码在其他编译器中编译运行正确,因此在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';
}
UPDATE: 已报告为错误 https://connect.microsoft.com/VisualStudio/feedback/details/1618414.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)