Я читал «Эффективный современный C++», и мое внимание привлекла следующая вещь:
В пункте 28 Скотт пишет:
Вместе эти наблюдения об универсальных ссылках и кодировании lvalue/rvalue означают, что для этого шаблона
template<typename T> void func(T&& param);
выведенный параметр шаблона T будет кодировать, является ли аргумент, переданный параметру, lvalue или rvalue. Механизм кодирования прост. Когда lvalue передается в качестве аргумента, T выводится как ссылка lvalue. Когда передается значение r, T выводится как не являющееся ссылкой. (Обратите внимание на асимметрию: lvalue кодируются как ссылки lvalue, а rvalue кодируются как не ссылки.)
Может кто-нибудь объяснить, почему был выбран такой механизм кодирования?
Я имею в виду, что если мы будем следовать правилам свертывания ссылок, то использование вышеупомянутого шаблона с rvalue даст ссылку на rvalue. И, насколько я могу судить, все будет работать точно так же, если бы это было выведено как ссылка rvalue. Почему он закодирован как нереференсный?
&&&
исключительно для ссылок на пересылку, вероятно, не будет принято в то время (в качестве третьего типа ссылки). - person dyp   schedule 29.08.2015T
не выводится какA&&
. - person dyp   schedule 29.08.2015