相关疑难解决方法(0)

为什么有注入的类名?

最近,我看到了一个奇怪的C++特性:注入类名.

class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚为什么这个功能是必要的.有没有需要此功能的练习?

我听说旧C++中不存在这个功能.然后,什么时候介绍?C++ 03?C++ 11?

c++

142
推荐指数
1
解决办法
6321
查看次数

注入的类名编译器差异

考虑以下代码:

struct foo{};

int main() {
    foo::foo a;
}
Run Code Online (Sandbox Code Playgroud)

我希望这个格式正确,foo通过[class]/2中的规则声明一个类型的变量(N4140,强调我的):

一个类名被插入在其中后立即宣布的范围类的名字能够被看见. 类名也被插入到类本身的范围 ; 这被称为注入类名.出于访问检查的目的,inject-class-name被视为公共成员名称.

clang 3.6.0同意我的意见,编译上面的代码没有适用的警告-Wall -pedantic.

gcc 5.2.0 不同意,提供以下错误消息:

main.cpp: In function 'int main()':
main.cpp:5:5: error: 'foo::foo' names the constructor, not the type
   foo::foo a;
Run Code Online (Sandbox Code Playgroud)

无论注入的类名称的嵌套有多深,例如,上述情况都适用foo::foo::foo::foo.

是否存在强制该构造在该上下文中被解释为构造函数的规则,或者这是一个gcc错误?或者我是否错误地解释标准报价?

c++ gcc clang language-lawyer c++14

22
推荐指数
2
解决办法
3741
查看次数

标签 统计

c++ ×2

c++14 ×1

clang ×1

gcc ×1

language-lawyer ×1