c++11 - std forward 采取右值参数如何绑定(bind)到 lvaue 参数引用

标签 c++11

这是std::forward的声明

template< class T >
T&& forward( typename std::remove_reference<T>::type& t );

这个纯右值字符串 "HelloWorld!" 如何作为 std::forward 中的左值引用绑定(bind)到 t

std::string&& rstr = std::forward<std::string>("HelloWorld!");

最佳答案

首先,"HelloWorld!" 是一个左值。 (const char 数组)。

但是你的代码使用了重载:

template< class T >
T&& forward( typename std::remove_reference<T>::type&& t );

C 字符串文字可以绑定(bind)到 std::string&&,通过衰减到 char const * 并用于初始化临时 std::string

请注意,稍后使用 rstr 将是未定义的行为,因为临时停止存在于语句末尾。 rstr 的生命周期没有生命周期延长,因为 rstr 绑定(bind)到一个 xvalue 但只有当引用绑定(bind)到 prvalue 时才会发生扩展。

关于c++11 - std forward 采取右值参数如何绑定(bind)到 lvaue 参数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39058377/

相关文章:

具有字符串和 shared_ptr union 的 C++11 类

nvcc 不支持 C++11 函数 iota()?

c++ - add_lvalue_reference_t<T> 和 T& 之间的区别

c++ - 为什么 std::map 在按值传递给 lambda 时表现异常?

c++ - float 的全局格式化选项

c++ - 成员初始值设定项中使用的 sizeof 的行为是什么?

c++ - 了解此示例中的移动构造函数行为

c++ - 使用 unique_ptr 离开范围时堆损坏

C++在构造函数中选择类成员的模板类型

c++ 11使用静态断言模板参数的行为