根据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
。
1条答案
按热度按时间nkoocmlb1#
我认为MSVC在这种情况下不符合标准。functional-style cast expressions中不允许Elaborated type specifiers。
T()
形式的表达式称为函数式类型转换表达式。[expr.type.conv]/1给出了它的精确语法:遗憾的是,simple-type-specifier 和 typename-specifier 都不允许使用复杂的类型说明符,因此
class T()
是非法的。cppreference有一个更容易理解的解释:
T
必须是单个单词类型名称(带有可选的限定和模板参数)。int()
、std::string()
、std::vector<int>()
可以,而unsigned int()
、class std::vector<int>()
则不行。