【发布时间】:2020-02-15 10:59:56
【问题描述】:
在以下场景中使用std::string_view:
struct A : public std::exception{
A (const char* c) : v_(c){}
const char* what() const noexcept override;
private:
std::string_view v_;
};
上面的想法很好用,现在copy-ctor默认为noexcept(这对于异常类型来说非常棒!)-并且字符串也在调用站点“验证”。
然而,剩下的事情是语义上 string_view 不保证为零终止(尽管在这种情况下,我们编写了这样的代码 - 最好是为这种特殊情况保证就像它只有我们实际使用的构造函数一样。
我正在考虑以下类似的方法是否是一个好的解决方法?
struct c_string_view {
c_string_view(const char* c) : sv_{c}{};
const std::string_view sv_;
};
但我想知道其他人是否有这个问题(以及他们做了什么),或者我是否忽略了一些简单的东西?
【问题讨论】:
-
您是否有理由不存储
const char*而不是std::string_view? -
std::exception::what() noexcept不是virtual方法,所以你不能override它。必须是const才能成为override-able。 -
就我个人而言,我只需要存储一个 std::string。与抛出的成本相比,分配的成本不会被注意到。如果你没有记忆,你有更大的事情要担心。这样做的好处是不必担心传递给异常的事物的生命周期。如果您真的担心能够分配字符串,您可以拥有一个静态成员并预先保留空间并使用它,这样您就不会在异常期间进行分配。
-
恕我直言,在 excpetion 中使用
std::string_view本质上是有缺陷的设计,您应该使用好的 'olstd::string -
真的,除非您使用 all 内存,否则我不会担心。一根弦很小。根据您的消息是什么,您甚至不会接近使用 KB 空间。你可以在一个 KB 的空间中得到很多单词,而你没有 KB 的空间的可能性几乎为零。
标签: c++ c++17 noexcept string-view