将左值绑定到MSVS2010下的右值引用
binding a lvalue to a rvalue reference under MSVS2010
#include<iostream>
template<class T>
struct Foo
{
T v_;
Foo(T&& v):v_(std::forward<T>(v))
{
std::cout << "building Foo..n";
}
};
int main()
{
int v;
Foo<int> foo(v);
std::cin.ignore();
}
Visual C++ 2010 输出:
错误 C2664:
'Foo<T>::Foo(T &&)'
:无法将参数 1 从'int'
转换为'int &&'
我不能将左值绑定到右值引用是正常的吗?
编辑:
函数也是如此:
void f(int && v)
{
}
int v;
f(v); //won't compile
我有点困惑,因为我认为 std::forward 对于检测是否使用左值或右值引用调用方法很有用。但似乎我们不能将任何左值绑定到右值引用中......至少没有模板参数,但我不太了解它
调用移动构造函数需要 r 值而不是 l 值是正常的,因为 l 值可以在移动构造函数运行后命名,并且使用移自值会引发意外行为。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 模板允许左值与右值引用绑定
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 将引用绑定到指针的语法是什么?(各种)
- 为什么我不能将常量左值引用绑定到返回 T&&&的函数?
- 为什么 VS 无法将右值引用绑定到指针?
- 出于什么原因,有必要将常量左值引用绑定到右值?
- 为什么此右值引用绑定到左值?
- 使用“void*”将右值引用绑定到左值
- 排序时引用绑定到 'value_type' 类型的 null 指针
- 无法将类型为"类名 &"的非常量左值引用绑定到类型为"类名"的右值
- 引用绑定和复制构造函数/移动构造函数
- 将引用绑定到类型的值会删除限定符 MULTISET
- 无法将类型"int&"的非常量左值引用绑定到类型为"int"的右值
- 多态变体,并将一种类型的引用绑定到另一种类型的引用
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)