将 std::string 的 xvalue 传递给采用 std::string_view 的函数

Posted

技术标签:

【中文标题】将 std::string 的 xvalue 传递给采用 std::string_view 的函数【英文标题】:Passing xvalue of std::string to function taking std::string_view 【发布时间】:2017-01-24 18:26:58 【问题描述】:

是UB做以下吗?

void foo(std::string_view view) ...

void bar()

   std::string str;
   foo(std::move(str));

谢谢!

【问题讨论】:

很确定它只是无法编译。 @nwp,我会在确定之前尝试一下。它编译只是因为 string_view 有 ctor 采用 const string& 你认为这个 UB 到底是什么? string_view 是只读的,move 实际上并没有移动任何东西。这只是一个演员表。 @Bikineev:“string_view 让 ctor 采用 const string&” 不,它没有。它的许多非标准实现确实如此,但实际的 C++17 basic_string_view 并不能那样工作。发生转换是因为basic_string 将自己转换为basic_string_view;视图类被认为是两者中更基本的。 如果你问我认为prvalues这个问题会更有趣。 【参考方案1】:

这是定义明确的行为,尽管它不是特别有用。 basic_stringoperator basic_string_view 将用于执行转换,它没有左值/右值限制。因此,如果您根本没有使用 move,它会做同样的事情。

【讨论】:

以上是关于将 std::string 的 xvalue 传递给采用 std::string_view 的函数的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 std::string 传递给 DLL 吗?

将 std::string_view 传递给执行 const std::string& 的 API

将`char []`传递给接受`std :: string&`的函数是不是是一种好习惯

如何将 std::string 环境块传递给 CreateProcess?

SWIG:如何包装 std::string&(通过引用传递的 std::string)

如何将 std::string 传递给需要 char* 的函数? [复制]