C++17 中对 const string 的引用的语义应该是什么?
What should be the semantics of a reference to const string in C++17?
有几种方法可以将文本信息传递给 C++ 中的函数:可以是 c-string/std::string,通过 value/by 引用,lvalue/rvalue,const/mutable. C++17 在标准库中添加了一个新的 class:std::string_view
。 string_view 的语义是提供没有所有权的只读文本信息。所以如果你只需要读取一个字符串,你可以使用:
void read(const char*); // if you need that in a c-style function or you don't care of the size
void read(const std::string&); // if you read the string without modification in C++98 - C++14
void read(std::string_view); // if you read the string without modification in C++17
我的问题是在 C++17 中是否存在 void read(const std::string&)
优于 void read(std::string_view)
的情况。假设不需要向后兼容。
您需要空终止吗?如果是这样,您必须使用其中之一:
// by convention: null-terminated
void read(const char*);
// type invariant: null-terminated
void read(std::string const&);
因为 std::string_view
只是 char const
的任何连续范围,不能保证它以 null 结尾,并且试图查看最后一个字符是未定义的行为。
如果您不需要空终止,但需要获取数据的所有权,请执行以下操作:
void read(std::string );
如果您既不需要空终止也不需要所有权或修改数据,那么您最好的选择是:
void read(std::string_view );
有几种方法可以将文本信息传递给 C++ 中的函数:可以是 c-string/std::string,通过 value/by 引用,lvalue/rvalue,const/mutable. C++17 在标准库中添加了一个新的 class:std::string_view
。 string_view 的语义是提供没有所有权的只读文本信息。所以如果你只需要读取一个字符串,你可以使用:
void read(const char*); // if you need that in a c-style function or you don't care of the size
void read(const std::string&); // if you read the string without modification in C++98 - C++14
void read(std::string_view); // if you read the string without modification in C++17
我的问题是在 C++17 中是否存在 void read(const std::string&)
优于 void read(std::string_view)
的情况。假设不需要向后兼容。
您需要空终止吗?如果是这样,您必须使用其中之一:
// by convention: null-terminated
void read(const char*);
// type invariant: null-terminated
void read(std::string const&);
因为 std::string_view
只是 char const
的任何连续范围,不能保证它以 null 结尾,并且试图查看最后一个字符是未定义的行为。
如果您不需要空终止,但需要获取数据的所有权,请执行以下操作:
void read(std::string );
如果您既不需要空终止也不需要所有权或修改数据,那么您最好的选择是:
void read(std::string_view );