Являются ли объекты внутри объекта, на который ссылается rvalue, также ссылками на rvalue?

#c #c 11 #rvalue-reference

#c #c 11 #rvalue-ссылка

Вопрос:

Являются ли объекты внутри объекта, на который ссылается rvalue, также ссылками на rvalue?

 struct A{
};

struct B{
   A a2;
};

//template<class B>
void test(B amp;amp;b){

    // 1. Is this the correct way?
    auto amp;amp;in3 = std::forward<B>(b).a2;
    std::cout << std::is_rvalue_reference<decltype(in3)>::value;
    // return true

    // 2. or this?
    auto amp;amp;in4 = b.a2;
    std::cout << std::is_rvalue_reference<decltype(in4)>::value;    
    // return false        
}

test(B());
  

http://coliru.stacked-crooked.com/a/bcf0f7dc4cc0440e

Ответ №1:

Да, члены rvalues сами являются rvalues . Это было разъяснено DR 421

Но здесь это не имеет значения:

auto amp;amp;in4 = b.a2;

b это не значение rvalue, это значение lvalue (простое эмпирическое правило: у него есть имя).

Чтобы восстановить категорию значений, которую она имела при передаче в нужную вам функцию forward

Комментарии:

1. Проблема, похоже, проясняется здесь .