2013和GCC之间的全局函数和不明确的参数NULL与char*
Global functions and ambiguous arguments NULL vs. char* between vs 2013 and GCC
我正在努力理解currenct 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;
}
Visual Studio使用默认vs标志调用f(char*, int)
GCC给了我一个编译器错误:重载的"f(char*&,NULL)"的调用不明确。仅使用CCD_ 2标志的gcc。
这取决于NULL
的定义。
MSVC将其定义为0
,因此int
重载是完全匹配的,并且是优选的。
GCC将其定义为编译器内部__null
,导致64位上的歧义,因为__null
的类型为long
。(在32位上,__null
的类型似乎是int
,因此在编译32位时会选择int
重载。)
该标准允许将NULL
定义为任何C++空指针常量,包括nullptr
,在这种情况下,它将明确地选择双指针重载或0L
,这将再次是不明确的(因为从long
到int
和char *
都涉及转换)。
寓意:不要将NULL
用作空指针。使用nullptr
。
相关文章:
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 如何在忽略 null 的同时将数据从 char [] 复制到常量字符 *
- 我正在尝试计算 char 数组中的内容,直到 null 终止,但每次编译时,我都会得到一个比我的数组大的数字
- 如何在默认构造函数中将 char 数组初始化为 null
- std :: cout null char*指针中止该程序
- 为什么一个指向char的C++指针在缺少null终止符的情况下充当字符串
- Null指针异常(int Vs char)
- C++:在文本文件中存储char数组时,是否存储Null
- 将以null结尾的char数组复制到符合缓冲区长度的std::字符串中
- C++将 char 复制到 char 数组(调试断言失败)时,字符串不是以 null 结尾的
- char* p=NULL, cout<<p;给出例外
- 检查char指针是否为null-Copy Constructor
- 将 char 数组作为参数传递时,为什么索引中不包含 null 终止符?
- C++将文本文件写入字符串并转换为double,会得到null char或0
- 初始化char数组以容纳非null终止的字符串
- 2013和GCC之间的全局函数和不明确的参数NULL与char*
- 为什么我的 char* 在循环中分配了一个字符串,但之后却"(null)"?编译器错误?
- 从std::string传递const char*到Lua堆栈将变为null
- 将char数组初始化为字符串值时,未初始化的索引被设置为null
- 从最多X个字符开始构造std::string,止于null char