According to Godbolt, this code compiles with MSVC but not with GCC and Clang [conformance view]. Which one is right and why?
#include <iostream>
void Example (){
std::cout << "function";
}
class Example{
public: Example() {
std::cout << "constructor";
}
};
int main()
{
Example();
class Example();
}
I understand that the function will be preferred, which is why I wrote class in the second line.
CodePudding user response:
I believe MSVC is not standard-conforming in this case. Elaborated type specifiers are not allowed in functional-style cast expressions.
Expressions in the form T() are called functional-style cast expressions. [expr.type.conv]/1 gives its precise syntax:
A simple-type-specifier or typename-specifier followed by a parenthesized optional expression-list or by a braced-init-list
Sadly neither simple-type-specifier nor typename-specifier allow elaborated type specifiers so class T() is illegal.
cppreference has a more comprehensible explanation: T must be a single word type name (with optional qualification and template arguments). int(), std::string(), std::vector<int>() are OK, while unsigned int(), class std::vector<int>() are not OK.
