привязка lvalue к ссылке на rvalue в MSVS2010 - PullRequest
2 голосов
/ 12 января 2012
#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();
}

визуальный вывод C ++ 2010:

ошибка C2664: 'Foo<T>::Foo(T &&)': невозможно преобразовать параметр 1 из 'int' в 'int &&'

Этонормально, что я не могу связать lvalue со ссылкой на rvalue?

РЕДАКТИРОВАТЬ:

то же самое для функции:

void f(int && v)
{

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

IЯ немного сбит с толку, потому что я думаю, что std :: forward полезен для определения, вызывается ли метод со ссылкой lvalue или rvalue.Но похоже, что мы не можем привязать lvalue к rvalue-ссылке ... по крайней мере, без параметра шаблона, но я не очень хорошо понимаю это

1 Ответ

2 голосов
/ 13 января 2012

Это нормально, что для вызова конструктора перемещения требуется r-значение, а не l-значение, поскольку l-значение может быть названо после запуска конструктора move, а использование значения move-from вызовет непреднамеренное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...