将左值绑定到MSVS2010下的右值引用

binding a lvalue to a rvalue reference under MSVS2010

本文关键字:引用 绑定 MSVS2010      更新时间:2023-10-16
#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 值可以在移动构造函数运行后命名,并且使用移自值会引发意外行为。