gpt4 book ai didi

c++ - 返回空字符串文字 VS。返回 nullptr - 它们是否相同?

转载 作者:行者123 更新时间:2023-11-28 01:14:59 25 4
gpt4 key购买 nike

我最近在我处理的应用程序的公共(public) SDK 中遇到了以下功能:

virtual char* ExtentName() {return "";}

当我使用带有 /permissive- 标志的 Visual Studio 编译应用程序时,上面的函数会导致以下编译错误:

error C2440: 'return': cannot convert from 'const char [1]' to 'char *'
note: Conversion from string literal loses const qualifier (see /Zc:strictStrings)

我真的很惊讶这段代码在任何情况下都能编译,因为它将字符串文字(在本例中为空终止符)转换为 char*。这怎么可能?

此外,我想在不导致 SDK 中断的情况下解决此问题。这是我认为最好的解决方案:

virtual char* ExtentName() {return nullptr;}

上述更改不会破坏 ABI,但我担心它会破坏我们用户的代码,尽管我不确定如何破坏。有这种可能吗?感谢您提供任何信息!

最佳答案

自 C++11 以来,不允许隐式地将字符串文字转换为 char* 而无需 const 限定。

MSVC 无论如何都允许它向后兼容,因为早期版本的 C++ 允许它。 /permissive- 标志使其行为符合标准。

第一个函数不返回空指针值,它返回一个指向字符串文字的有效指针,该字符串文字将是长度为 1char 数组,仅包含空终止符。因此,这两个功能根本不相等。

第二个函数返回一个空指针值,与第一个函数的返回值相比,它可以例如不被间接通过。

从技术上讲,您可以通过执行显式 const_cast 来保留函数签名:

virtual char* ExtentName() { return const_cast<char*>(""); }

它本身具有明确定义的行为,但任何尝试写入此函数返回的指针指向的数组都将导致未定义的行为,而编译器不会发出警告。

因此不应该这样做。但是,如果您已经针对以前的 C++ 标准或许可编译器编译了原始函数,那么该函数已经完全做到了这一点,并且不会引入任何 UB 风险。通过返回的指针写入在原始代码中也是 UB,没有警告。

正确的做法是使返回值const char*,因为显然不允许用户修改此函数返回的指向值。从一开始就没有这样做可能是个错误。

关于c++ - 返回空字符串文字 VS。返回 nullptr - 它们是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984921/

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