调用同名类的函数/构造函数:哪个编译器处理符合C++标准?
同名函数与类的编译一致性问题解答
有如下C代码,在MSVC中可编译通过,但GCC和Clang会报错,请问哪种编译器的处理符合C标准?
#include <iostream> void Example (){ std::cout << "function"; } class Example{ public: Example() { std::cout << "constructor"; } }; int main() { Example(); class Example(); }
核心规则与分析
- 最令人头疼的解析(Most Vexing Parse):C++标准明确规定,当一段代码同时满足表达式和函数声明的解析规则时,编译器必须优先将其解析为函数声明。
- 禁止嵌套函数声明:C++不允许在函数内部声明另一个函数。
对main中代码的具体解析:
Example();:按照规则会被解析为函数声明——声明一个名为Example、无参数、返回Example类类型的函数。虽然全局已有void Example(),但此处属于合法的函数重载,因此这行代码本身不会触发错误。class Example();:这段代码完全符合函数声明的结构:返回类型为class Example(用详述类型说明符明确指定类类型),函数名Example,无参数。按照Most Vexing Parse规则,必须优先解析为函数声明,而C++禁止在main内部声明函数,因此GCC和Clang报错是符合标准的行为。
MSVC的处理违反了标准:它没有遵循优先解析为函数声明的规则,而是将class Example();错误地解析为创建Example类临时对象的表达式,因此错误地允许代码通过编译。
结论
GCC和Clang的处理正确,MSVC的处理不符合C++标准。
内容的提问来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

