Ste*_*ult 4 c++ gcc visual-c++ c++11
我试图理解当前C++ 14标准关于解决模糊函数调用的内容,主要是因为我看到了GCC 4.9.1和Visual Studio 2013更新3之间的区别
这是代码(MS和GCC完全相同):
#include <iostream>
using namespace std;
void f(char *str, int chars) { cout << "f(char*, int)"; }
void f(char *first, char *second) { cout << "f(char*, char*)"; }
int main()
{
char *hello = "Hello, World";
f(hello, NULL); //which f gets called?
char c; cin.get(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio调用f(char*, int)使用默认vs标志GCC给我一个编译器错误:调用重载'f(char*&,NULL)'是不明确的.gcc只使用-std=c++11标志.
这取决于NULL定义的内容.
MSVC将其定义为0,因此int重载是完全匹配并且是首选.
GCC将其定义为编译器内部__null,导致64位的模糊,因为它__null的类型存在long.(看起来它__null的类型是int32位的,所以它int在编译32位时选择过载.)
标准允许NULL定义为任何C++空指针常量,包括nullptr,在这种情况下,它将明确地选择两个指针重载,或者0L,它将再次模糊(从a long到两者int并char *涉及转换).
道德:不要NULL用于空指针.使用nullptr.
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |