Вопрос по c++, c++11 – использование rvalue ссылки и авто

4

Учитывая код ниже, все работает. Почему эта переменная d является ссылкой на int? Что здесь происходит?

int main()
{
    int a= 10;
    int &&b = a+10; // b is int &&
    auto c =b+10; // c is int
    auto &&d = a; // d is int&
    //int &&di = a; // error, as expected
    return (0);
}

Ваш Ответ

4   ответа
1

auto&& вызывает совершенную пересылку. Какa является lvalue типаint, d это lvalue ссылка наint.

хорошо, но auto & dr = a тоже относится к int. Это просто не интуитивно понятно. По крайней мере, на первый взгляд. dodol
1

как заставить d быть эталонной ссылкой. Вы можете использовать std :: move для этого:

int a =4; 
auto &&d = std::move(a); // d is type &&

Конечно, когда речь идет о целых числах, ссылки на rvalue глупы, так как передача по значению также эффективна. Это полезно при форсировании семантической оптимизации перемещения, например, если вы хотите вставить сложный тип в конец функции, где этот тип выйдет из области видимости ...

vector<std::string> v;
void f()
{
    string s;
    foo(s); // do some kind of operation on s.
    v.push_back(std::move(s)); // use push_back( &&) instead of push_back(const &); 
}
6

reference collapsing правила при выводе типа.

A& & becomes A&
A& && becomes A&
A&& & becomes A&
A&& && becomes A&&
3

auto &&d = a; & Quot; Авто & Amp; & Amp; & Quot; является rvalue ссылкой на неконстантный энергонезависимый тип и "a" является lvalue, то применяется это специальное правило: тип & quot; a & quot; трактуется как int & amp; вместо int. Затем, как обычно, выберите тип «авто» быть идентичным типу "a", то есть int & amp; Таким образом, тип "авто & amp; & quot;" это int & amp; в соответствии со ссылкой рушится, как упомянуто bames53.

Это не особое правило, сбивающее с толку&& имеет совершенно другую семантику применительно к аргументам шаблона (и, следовательно, автоматически типизированным переменным)
Сначала определение типа auto аналогично выводу аргументов шаблона из вызова функции (7.1.6.4/6), тогда это правило в 14.8.2.1/3.
где в стандарте указано это правило?

Похожие вопросы