使用带有标志 -std=c++17
的 gcc-7.1 编译,以下程序会引发错误:
#include <string_view>
void foo(const char* cstr) {}
void bar(std::string_view str){
foo(str);
}
错误信息是
In function 'void bar(std::string_view)':
error: cannot convert 'std::string_view {aka std::basic_string_view<char>}' to 'const char*' for argument '1' to 'void foo(const char*)'
foo(str);
我很惊讶没有转换为 const char*
因为其他库(abseil,bde)提供类似的 string_view
隐式转换为 const char*
的类。
原文由 Justin Raymond 发布,翻译遵循 CC BY-SA 4.0 许可协议
std::string_view
不提供到const char*
的转换,因为 它不存储以 null 结尾的字符串。它基本上存储了指向第一个元素的指针和字符串的长度。这意味着您不能将其传递给期望以空字符结尾的字符串的函数,例如foo
(您还要如何获得大小?),该函数需要const char*
等等决定不值得。如果您确定您的视图中有一个以 null 结尾的字符串,则可以使用
std::string_view::data
。如果你不是,你应该重新考虑是否首先使用
std::string_view
是一个好主意,因为如果你想要一个有保证的以 null 结尾的字符串std::string
是你想要的。对于单行,您可以使用std::string(object).data()
( 注意:返回值指向一个 临时 的std::string
实例,该实例将在表达式结束后被销毁!)。