gpt4 book ai didi

c++ - 通过引用和内联返回文字

转载 作者:太空狗 更新时间:2023-10-29 19:46:14 25 4
gpt4 key购买 nike

据说,在 C++ 中返回一个通过引用的文字是不好的,因为文字超出范围然后离开函数:

const char &ToBoolean(bool val) const 
{
return val ? (const char &)"1" : (const char &)"0";
}

,但是当使用 inline 时,我猜这应该没问题,因为文字的范围现在在调用函数中,或者不是?示例:

inline const char &ToBoolean(bool val) const 
{
return val ? (const char &)"1" : (const char &)"0";
}

这就是我打算如何使用它:

void testToBoolean1()
{
bool val = true;
const char *valStr = ToBoolean(val);
int result = strcmp("1", valStr);
CPPUNIT_ASSERT_EQUAL(0, result);
}

更新。

如果静态字符串没问题,那这个怎么样?

inline const char *ToBoolean(bool val) const { 
char boolStr[6];
if (val) strcpy(boolStr, "true");
else strcpy(boolStr, "false");
return &boolStr;
}

使用 VC++ 2012 编译和运行良好。

最佳答案

字符串文字与局部变量不同,它们在整个程序生命周期内都保持事件状态。它们具有静态持续时间生命周期。您可以安全地返回指向字符串文字的指针。

C++11 标准 §2.14.5.8:

Ordinary string literals and UTF-8 string literals are also referred to as narrow string literals. A narrow string literal has type “array of n const char”, where n is the size of the string as defined below, and has static storage duration (3.7).

3.7.1 静态存储时长
第 1 段:

...The storage for these entities shall last for the duration of the program (3.6.2, 3.6.3)


需要说明的是,字符串文字“1”的类型是char (*)[2]。这是因为,“1”的类型是 char[2],指向 2 个字符的数组的指针被声明为 char (*)[2],所以如果您需要获取它的地址。当返回一个引用时,你的隐式 c 风格转换会转化为 reinterpret_cast,它基本上可以将任何类型的指针转​​换为任何其他类型,而不管正确性。在您的情况下,它带给您的是未定义的行为。如上所述,您可以安全返回的是指向字符串文字的指针。您需要将返回类型修改为:

char const* ToBoolean(bool val) const;

更新问题的答案:

您更新后的解决方案只是将字符串文字复制到函数的本地数组中。该数组不存在于函数范围之外。所以不,这不好。它可能看起来有效,但它会调用未定义的行为。 “true”和“false”本身具有静态持续时间生命周期,但您没有返回指向它们的指针,而是将它们复制到本地数组并返回指向本地数组的指针。

关于c++ - 通过引用和内联返回文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15598023/

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