I got following unexpected overload resolution behavior with the visual studio compiler (tested in VS2010 and VS2012).
Minimal example:
#include <iostream> #include <string> void f(void *) { std::cout << "f(void*)\n"; } void f(const std::string &) { std::cout << "f(const std::string &)\n"; } int main() { f("Hello World!"); } Output:
> f(void *) Expected Ouptut:
> f(const std::string &) Compiling with GCC(tested with 4.6.3) generates the expected output.
If I comment out the "const std::string &" version of f(), visual studio happily compiles on /W4 without any warnings, while GCC emits following error (as expected): "invalid conversion from 'const void*' to 'void*' [-fpermissive]".
Does anyone know why visual studio behaves in that way, choosing basically a const cast overload over a conversion to std::string for char[]?
Is there any way to prohibit this behavior, or at least get VS to generate a warning?