c++ - 整数->指针转换规则

标签 c++ visual-c++ types

考虑下面的代码。

void f(double p) {}
void f(double* p) {}

int main()
{ f(1-1); return 0; }

MSVC 2017不会对此进行编译。它表明存在一个模棱两可的重载调用,因为1-10相同,因此可以转换为double*。其他技巧,例如0x00Lstatic_cast<int>(0)也不起作用。甚至声明const int Zero = 0并调用f(Zero)也会产生相同的错误。仅当Zero不是const时,它才能正常工作。

看起来同一问题适用于GCC 5及以下版本,但不适用于GCC6。我很好奇这是否是C++标准的一部分,已知的MSVC错误或编译器中的设置。粗略的Google并未产生结果。

最佳答案

MSVC认为1-1是一个空指针常量。这对于C++ 03的标准是正确的,在C++ 03中,所有具有0值的整数常量表达式都是空指针常量,但是它进行了更改,以便对于带有CWG issue 903的C++ 11,只有零个整数常量是空指针常量。如您在示例中以及标准中所记录的那样,这是一个重大更改,请参阅C++ 14标准(N4140草稿)的[diff.cpp03.conv]

MSVC仅在一致性模式下应用此更改。因此您的代码将使用/permissive-标志进行编译,但我认为更改仅在MSVC 2019中实现,请参见here

对于GCC,GCC 5默认为C++ 98模式,而GCC 6和更高版本默认为C++ 14模式,这就是行为更改似乎取决于GCC版本的原因。

如果使用空指针常量作为参数调用f,则该调用是模棱两可的,因为可以将空指针常量转换为任何指针类型的空指针值,并且此转换与int(或任何整数)的转换具有相同的等级。类型)到double

关于c++ - 整数->指针转换规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60824270/

相关文章:

c++ - 为什么不能在函数中使用模板别名作为参数并自动推导?

c++ - OpenGL 着色器 : uniform variables count incorrect

c++ - 变量在没有初始化的情况下被使用

c++ - 将 float 转换为 unsigned short 时出现舍入问题

java - 了解泛型 : Incompatible types when class has generic type and implements one of its parametrised superclass

java - 如何从java程序打印.exe printf()消息

android - 将 Android NDK make 文件重构为模块

c++ - 如何在 C++ 中使用 "%"运算符?

Delphi:用于索引 TStringList 项的 Integer 以外的类型

arrays - 在 Swift 中创建包含不同类型的多维数组