Правила на самом деле довольно просты. Rvalue reference
является ссылкой на некоторое временное значение, которое не сохраняется за пределами выражения, которое его использует, - в отличие от lvalue reference
, которое ссылается на сохраняющиеся данные. Поэтому, если у вас есть ссылка на сохраняющиеся данные, независимо от того, с какими другими ссылками вы ее совмещаете, фактические ссылочные данные являются lvalue - это охватывает первые три правила. 4-е правило также является естественным - ссылка rvalue на ссылку rvalue по-прежнему является ссылкой на непостоянные данные, поэтому дается ссылка rvalue.
Да, утилиты C ++ 11 полагаются на эти правила, реализация предоставленная вашей ссылкой, соответствует реальным заголовкам: http://en.cppreference.com/w/cpp/utility/forward
И да, рушительные правила вместе с аргументом шаблона правило дедукции применяется при использовании утилит std::move
и std::forward
, как описано в вашей ссылке.
Использование типов типов, таких как remove_reference
, действительно зависит от ваших потребностей; move
и forward
для наиболее случайных случаев.