【问题标题】:binding a lvalue to a rvalue reference under MSVS2010在 MSVS2010 下将左值绑定到右值引用
【发布时间】:2012-01-12 19:46:04
【问题描述】:
#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&lt;T&gt;::Foo(T &amp;&amp;)':无法将参数 1 从 'int' 转换为 'int &amp;&amp;'

我不能将左值绑定到右值引用是否正常?

编辑:

函数也一样:

void f(int && v)
{

}
int v;
f(v); //won't compile

我有点困惑,因为我认为 std::forward 对于检测是否使用左值或右值引用调用方法很有用。 但似乎我们无法将任何左值绑定到右值引用中......至少没有模板参数但我不太了解它

【问题讨论】:

  • 是的,这很正常。仅当构造函数本身是模板时,引用折叠规则才适用。
  • 如果引用折叠规则总是适用于右值引用语法而不管上下文,那么就不可能专门表示一个真正的右值引用,这不会很有用。
  • void f(int &amp;&amp; v) 中,v 始终是一个右值引用。在template&lt;typename U&gt; void f(U &amp;&amp; v) 中,v 由于引用折叠规则,可以是右值引用或左值引用。
  • This 可能会让你更清楚。
  • 因为您传递的是左值,而不是右值。

标签: c++ c++11 visual-c++-2010 rvalue-reference


【解决方案1】:

调用移动构造函数需要一个右值而不是左值是正常的,因为左值可以在移动构造函数运行后命名,并且使用移动的值会引发意外行为。

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 2014-10-31
    • 2017-04-13
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多