来自右值类型的非const引用
non-const reference of type from an rvalue
考虑以下代码:
class Widget{};
template<typename T>
T &&foo2(T &&t){
return std::forward<T>( t );
}
/// Return 1st element
template<typename T>
typename std::tuple_element<0, typename std::decay<T>::type >::type &&foo(T &&t){
return std::forward< typename std::tuple_element<0, typename std::decay<T>::type >::type >
( std::get<0>(t) );
}
Widget w;
auto list = std::make_tuple(
w,
Widget()
);
int main()
{
auto &l = foo(list ); // This is NOT work
//auto &l2 = foo2( std::get<0>(list) ); // This one works.
}
http://coliru.stacked-crooked.com/a/4d3b74ca6f043e45 当我试图编译这个时,我得到了以下错误:
error: invalid initialization of non-const reference of type 'Widget&' from an rvalue of type 'std::tuple_element<0ul, std::tuple<Widget, Widget> >::type {aka Widget}'
好吧,那就好了,但是:
首先,这个Widget w不是临时的。为什么它把它当作暂时的?
在第二,为什么foo2工作比?
注:正如你所看到的,我试着写一个函数,它同时操作左值和右值。如果第一个元素是临时的,我想返回右值,如果不是-左值
tuple_element
返回元素类型,而不是引用类型(除非元素类型本身是引用类型)。
如果类型T
是引用类型,则需要让它返回引用类型。
这可以用条件来表示:
typename std::conditional<std::is_lvalue_reference<T>::value,
typename std::add_lvalue_reference<
typename std::tuple_element<0, typename std::decay<T>::type >::type>::type,
typename std::tuple_element<0, typename std::decay<T>::type >::type>::type
或者,更容易,使用decltype
,因为std::get
已经为您执行此计算:
decltype(std::get<0>(std::declval<T &&>())) &&
你可以做得更简单:
template<typename T>
auto foo(T &&t) -> decltype(std::get<0>(std::forward<T>(t))) {
return std::get<0>(t);
}
foo
返回一个右值引用,所以你不能将它绑定到auto&
,因为这需要一个左值引用。
foo2
使用"通用引用",在这种情况下计算为左值引用,因为std::get返回左值引用,并且您完美地将其转发到返回值。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 对临时对象的Const引用不会延长其生存期
- 对 const 引用参数使用默认值会导致崩溃
- 在运算符重载中使用带有 const 引用的 friend 函数
- C++通过 const 引用传递时不调用派生类函数
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么要返回对小类成员的 const 引用?
- C - 最好将枚举类作为值或const引用
- RVO:返回由值传递的值,即使显式分配给 const 引用也是如此
- const引用与可变成员的对象
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- 对类成员而不是 getter 的 Const 引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- STD ::配对的const引用如何工作
- 为什么我的C 函数拒绝返回const引用