返回本地文字的 string_view 是如何工作的
How returning a string_view of a local literal works
考虑这个 snippet:
#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"
的生命周期是通过什么机制不同的。
but both g++ and clang say nothing, so this code seems legit and works.
你不能从前者推导出后者。许多非法代码不会产生警告。
也就是说,字符串文字具有静态存储持续时间,因此它们的生命周期没有问题。 to_stringview
确实是合法的。
P.S。字符串文字是 char 数组。
I was wondering by which mechanism the lifetime of "hello" is different from the lifetime of "hey".
这两个字符串文字的生命周期没有区别。但是 "hey"s
不是字符串文字。它是创建 class std::string
的临时实例的“用户定义”文字。该临时对象没有静态存储持续时间。
考虑这个 snippet:
#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"
的生命周期是通过什么机制不同的。
but both g++ and clang say nothing, so this code seems legit and works.
你不能从前者推导出后者。许多非法代码不会产生警告。
也就是说,字符串文字具有静态存储持续时间,因此它们的生命周期没有问题。 to_stringview
确实是合法的。
P.S。字符串文字是 char 数组。
I was wondering by which mechanism the lifetime of "hello" is different from the lifetime of "hey".
这两个字符串文字的生命周期没有区别。但是 "hey"s
不是字符串文字。它是创建 class std::string
的临时实例的“用户定义”文字。该临时对象没有静态存储持续时间。