Clang (3.9.1) and GCC (7, snapshot)
print "1", "2" to the console when this code is
run.
However, MSVC fails to compile this
code:
source_file.cpp(15): error C2668: 'Dictionary::set': ambiguous call to
overloaded function
source_file.cpp(9): note:
could be 'void Dictionary::set(int64_t)'
source_file.cpp(8): note: or 'void Dictionary::set(const char
*)'
source_file.cpp(15): note: while trying to
match the argument list '(const unsigned
int)'
#include
static const unsigned ProtocolMajorVersion =
1;
static const unsigned ProtocolMinorVersion = 0;
class
Dictionary {
public:
void set(const char *Str) { std::cout <<
"1"; }
void set(int64_t val) { std::cout << "2";
}
};
int main() {
Dictionary
dict;
dict.set(ProtocolMajorVersion);
dict.set(ProtocolMinorVersion);
}
I
think MSVC is right - the value of ProtocolMajorVersion is
0, which can be NULL or
int64_t(0).
However,
this seems to be the case when
replacing
dict.set(ProtocolMinorVersion)
with
dict.set(0);
source_file.cpp:15:10: error: call to member function 'set' is
ambiguous
dict.set(0);
source_file.cpp:8:10: note: candidate
functionvoid set(const char *Str)
{ std::cout << "1"; }
source_file.cpp:9:10: note: candidate
functionvoid set(int64_t val) {
std::cout << "2";
}
So
what's going on here - which compiler is right? Would surprise me if both GCC and Clang
are accepting incorrect code, or is MSVC just being buggy? Please refer to the
standard
No comments:
Post a Comment