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

Calling non static function or constructor using "class::func()" from outside

本文关键字:调用 构造函数 静态函数 func class 从外部      更新时间:2023-10-16

我在Meeting C++(@meetingcpp)上看到了这个片段

以下代码在clang和MSVC上编译良好(可以在这里尝试),但在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不应该编译?

这是Clang中的一个已知错误,错误报告23253、23254和13403都是该问题的报告。具有讽刺意味的是,这个问题实际上是程序在三大C++编译器中以不同方式编译的重复。哪一个是对的?。

根据标准12.1/p2 Constructors[class.ctor](Emphasis Mine):

构造函数用于初始化其类类型的对象。因为构造函数没有名称,所以在名称查找过程中永远找不到它们但是使用函数表示法(5.2.3)将导致构造函数被调用初始化对象。[注意:用于初始化类的对象类型见12.6。——尾注]

因此,不能直接调用构造函数,因为构造函数没有名称,而且在名称查找过程中永远找不到它们。

因此,GCC符合,而CLANG和VC++则不符合。