c++ 调用同名类的函数或构造函数,哪个编译器能正确完成?

vbkedwbf  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(160)

根据Godbolt的说法,这段代码是用MSVC编译的,而不是用GCC和Clang [ conformance view ]编译的。

#include <iostream>

void Example (){
    std::cout << "function";
}

class Example{ 
    public: Example() { 
        std::cout << "constructor";
    }
};

int main()
{
    Example();
    class Example();
}

我理解the function will be preferred,这就是为什么我在第二行写class

nkoocmlb

nkoocmlb1#

我认为MSVC在这种情况下不符合标准。functional-style cast expressions中不允许Elaborated type specifiers
T()形式的表达式称为函数式类型转换表达式。[expr.type.conv]/1给出了它的精确语法:

  • 简单类型说明符 * 或 * 类型名说明符 *,后跟带括号的可选表达式列表或带括号的初始化列表

遗憾的是,simple-type-specifiertypename-specifier 都不允许使用复杂的类型说明符,因此class T()是非法的。
cppreference有一个更容易理解的解释:T必须是单个单词类型名称(带有可选的限定和模板参数)。int()std::string()std::vector<int>()可以,而unsigned int()class std::vector<int>()则不行。

相关问题