gpt4 book ai didi

C++11 向后兼容性(空整数常量到指针的转换)

转载 作者:可可西里 更新时间:2023-11-01 15:56:45 27 4
gpt4 key购买 nike

C++ 标准允许将零整数常量隐式转换为任何类型的指针。

下面的代码是无效的,因为 v 的值在这里不是常量:

float* foo()
{
int v = 0;
return v; // Error
}

但是下面的代码是正确的:

float* foo()
{
const int v = 0;
return v; // Ok in C++98 mode, error in C++11 mode
}

问题是:为什么gccclang(试过不同的版本)在c++98/03模式下编译代码正确但是在 c++11/14 模式下编译时返回警告/错误 (-std=c++11)?我试图在 C++11 工作草案 PDF 中找到更改,但没有成功。

Intel 编译器 16.0 和 VS2015 编译器在这两种情况下均未显示任何错误和警告。

最佳答案

GCC 和 Clang 与 -std=c++11 的行为不同,因为 C++11 更改了空指针常量的定义,然后 C++14 又更改了它,参见 Core DR 903它改变了 C++14 中的规则,因此只有文字是空指针常量。

在 C++03 4.10 [conv.ptr] 中说:

A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero.

这允许各种表达式,只要它们是常量且计算结果为零即可。枚举、false(5 - 5) 等等......这曾经在 C++03 代码中引起很多问题。

在 C++11 中它说:

A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to zero or a prvalue of type std::nullptr_t.

在 C++14 中它说:

A null pointer constant is an integer literal (2.14.2) with value zero or a prvalue of type std::nullptr_t.

这是一个限制性更强的规则,也更有意义。

关于C++11 向后兼容性(空整数常量到指针的转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33656742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com