c++ - 返回本地文字的 string_view 如何工作
问题描述
考虑这个片段:
#include <iostream>
#include <string>
#include <string_view>
using namespace std::literals;
class A
{
public:
std::string to_string() const noexcept
{
return "hey"; // "hey"s
}
std::string_view to_stringview() const noexcept
{
return "hello"; // "hello"sv
}
};
int main()
{
A a;
std::cout << "The class says: " << a.to_string() << '\n';
std::cout << "The class says: " << a.to_stringview() << '\n';
}
我天真地期待一些警告,to_stringview()
比如返回一个本地临时的引用,但是 g++ 和 clang 都没有说什么,所以这段代码看起来合法并且有效。
由于这会产生预期的警告:
const std::string& to_string() const noexcept
{
return "hey"s;
}
我想知道通过哪种机制的生命"hello"
周期与"hey"
.
解决方案
但是 g++ 和 clang 都什么也没说,所以这段代码看起来合法并且有效。
你不能从前者推断出后者。许多非法代码不会产生警告。
也就是说,字符串文字具有静态存储持续时间,因此它们的生命周期没有问题。to_stringview
确实是合法的。
PS 字符串文字是 char 数组。
我想知道“你好”的生命周期与“嘿”的生命周期是通过哪种机制不同的。
这两个字符串文字的生命周期没有区别。但"hey"s
不是字符串文字。它是一个“用户定义的”字面量,用于创建类的临时实例std::string
。该临时对象没有静态存储持续时间。
推荐阅读
- node.js - 从 node.js 加载 TensorFlow 冻结模型时出现 ECONNREFUSED 错误
- tensorflow - 从集群服务多个深度学习模型
- azure-devops - AzureDevops 发布发布了太多 zip 文件
- database - 实体框架在运行时创建表
- python - 根据 xlsxwriter 中的列对数据进行排序
- ruby-on-rails - 如何将 embeds_many / embedded_in 存储在 mongoid 中作为哈希而不是数组?
- c - 为什么我的 printf() 不打印文本文件中的第一个字符?
- laravel - 从 api 注册时发送验证邮件
- javascript - 为什么 document.getElementById.style 和 $.css 行为不同
- php - 在php中解析url地址