gpt4 book ai didi

c++ - 类名注入(inject)和构造函数

转载 作者:IT老高 更新时间:2023-10-28 23:00:18 26 4
gpt4 key购买 nike

最近,在将库更新到 Clang 5.x 时,我注意到我之前在 Clang 4.x、GCC 5.x-6.x 以及 MSVC 2015 和 2017 上编译的代码中有一个错误。

#include <iostream>
#include <typeinfo>
#include <vector>

int main()
{
using a = typename std::vector<int>::vector;
std::cout << typeid(a).name() << std::endl;
return 0;
}

Clang-5.x 会产生以下警告消息,而所有其他编译器都会静默编译上述代码:

a.cpp:7:42: warning: ISO C++ specifies that qualified reference to 'vector' is a
constructor name rather than a type in this context, despite preceding
'typename' keyword [-Winjected-class-name]
using a = typename std::vector<int>::vector;

哪个编译器有问题?我是否正确假设 Clang5.x 在这里具有正确的行为,并且所有其他编译器(和版本)都不正确。如果是这样,是否值得向 MSVC 和 GCC 提交错误报告?

最佳答案

Clang-5 非常正确。在 [class.qual]/2 :

In a lookup in which function names are not ignored and the nested-name-specifier nominates a class C:

  • if the name specified after the nested-name-specifier, when looked up in C, is the injected-class-name of C
  • ...

the name is instead considered to name the constructor of class C.

至于问题的另一部分。是的,提交错误报告绝对值得。 IMO 应鼓励符合标准(或至少对其进行更多诊断)。

关于c++ - 类名注入(inject)和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46412754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com