Обычно rvalues могут связываться с константными ссылками (const SomeType&
). Он встроен в язык. Однако std::reference_wrapper<const T>
не принимает значение rvalue в качестве аргумента конструктора, так как соответствующая перегрузка намеренно удаляется. В чем причина этой несогласованности? std::reference_wrapper
"рекламируется" как альтернатива ссылочной переменной для случаев, когда мы должны передавать по значению, но хотели бы сохранить ссылочную семантику.
Другими словами, если привязка rvalue к const &
считается безопасной, так как она встроена в язык, почему дизайнеры С++ 11 не разрешали rvalues быть заключены в std::reference_wrapper<const T>
?
Когда это пригодится, вы можете спросить. Например:
class MyType{};
class Foo {
public:
Foo(const MyType& param){}
};
class MultiFoo {
public:
MultiFoo(std::initializer_list<std::reference_wrapper<const MyType>> params){}
};
int main()
{
Foo foo{MyType{}}; //ok
MultiFoo multiFoo{MyType{}, MyType{}}; //error
}