我在Meeting C ++(@meetingcpp)上看到了这个片段
以下代码在clang和MSVC(可以尝试here)上编译正常但在gcc和icc上失败。
#include <iostream>
using namespace std;
struct B {};
struct C {
C() { cout << "C()\n"; }
C(B *) { cout << "C(B *)\n"; }
};
B *p = nullptr;
int main() {
C::C(p);
return 0;
}
这是Clang和MSVC中的已知错误,或者此代码有可能合法吗?
p
的类型是B *
,但C::C
不应该编译?
答案 0 :(得分:3)
根据标准12.1 / p2构造函数[class.ctor]( Emphasis Mine ):
构造函数用于初始化其类类型的对象。 因为构造函数没有名称,所以在名称查找期间永远不会找到它们; 但是使用了 函数表示法(5.2.3)将导致调用构造函数 初始化一个对象。 [注意:用于初始化类的对象 类型见12.6。 - 结束说明]
因此,您不能直接调用构造函数,因为构造函数没有名称,并且在名称查找期间永远不会找到它们。
因此,GCC符合要求,而CLANG和VC ++则不符合。
答案 1 :(得分:3)
这是Clang中的一个已知错误,错误报告23253,23254和13403都是该问题的报告。具有讽刺意味的是,这个问题实际上是Program being compiled differently in 3 major C++ compilers. Which one is right?的重复。