在C++中从字符串字面值返回const char*?

8

通常情况下,我会从函数中返回一个std::string,因为返回const char*会要求调用者提供一个输出内存缓冲区,而该缓冲区是不可调整大小的。

但如果它来自字符串字面值,那么返回const char*是否有效呢?

const char* generate_c_string() {
    return "ABC";
}

以这种方式进行(如果有效)可能会更快,因为我不需要动态分配内存来构建std::string
它很可能是有效的,因为const char* x = "ABC";是有效的。是否有C++标准的参考资料证实它的有效性?

我不理解为什么调用者需要提供任何缓冲区,如果你返回一个指针。 - Sami Kuhmonen
尽管我投票将其视为重复问题,但我还是给问题和答案点了赞,因为它们仍然有用。 - Tas
2
请注意,对于这样的短字符串,最常见的std::string实现不会分配任何动态内存。在std::string上下文中SSO缩写的含义。来源 - Bo Persson
如果您不需要完整的std::string,那么很可能一个std::string_view就足够了。当然,它仍然具有相同的生命周期要求,因为它没有使用自己的存储。 - chris
哦,是的,作为一个参数,但是然后就不会返回一个指针了。这就是让我困惑的地方。 - Sami Kuhmonen
显示剩余2条评论
1个回答

13

这是有效的,适用于字符串字面值

字符串字面值具有静态存储期限,因此在程序的整个生命周期中都存在于内存中。

返回的指针将在程序的生命周期内保持有效。


3
这是否涵盖了边缘情况,例如从后来被卸载的动态库中导入generate_c_string - user7860670
1
@VTT 这听起来值得提出一个问题。 - Passer By

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接