从外部使用“class :: func()”调用非静态函数或构造函数

时间:2015-12-17 07:33:46

标签: c++ gcc clang language-lawyer c++14

我在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不应该编译?

2 个答案:

答案 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?的重复。