Angular Universal, рендеринг на стороне сервера и наблюдение за исходящими HTTP-запросами в NodeJS

Он обозначает ссылку rvalue. Ссылки Rvalue будут привязываться только к временным объектам, если они явно не созданы иначе.

В C ++ 03 вы не можете различать копию, которая может быть использована для того, чтобы сделать объекты более эффективными при определенных обстоятельствах и обеспечить объект, известный как совершенная переадресация. не изменяемого lvalue и rvalue.

std::string s;
std::string another(s);           // calls std::string(const std::string&);
std::string more(std::string(s)); // calls std::string(const std::string&);

В C ++ 0x это не так.

std::string s;
std::string another(s);           // calls std::string(const std::string&);
std::string more(std::string(s)); // calls std::string(std::string&&);

Рассмотрим реализацию этих конструкторов. В первом случае строка должна выполнить копию, чтобы сохранить семантику значений, что связано с новым распределением кучи. Однако во втором случае мы заранее знаем, что объект, который был передан нашему конструктору, немедленно должен быть уничтожен, и он не должен оставаться нетронутым. Мы можем эффективно просто поменять внутренние указатели и вообще не выполнять какое-либо копирование в этом сценарии, что существенно более эффективно. Перемещение семантики выгодно любому классу, который имеет дорогостоящее или запрещенное копирование ресурсов, на которые ссылаются внутренние ресурсы. Рассмотрим случай std::unique_ptr - теперь, когда наш класс может различать временные и не временные, мы можем заставить семантику перемещения работать правильно, чтобы unique_ptr не мог быть скопирован, но может быть перемещен, что означает, что std::unique_ptr может быть законно сохранены в стандартных контейнерах, отсортированы и т. д., тогда как C ++ 03 std::auto_ptr не может.

Теперь мы рассмотрим другое использование ссылок rvalue - идеальную пересылку. Рассмотрим вопрос привязки ссылки к ссылке.

std::string s;
std::string& ref = s;
(std::string&)& anotherref = ref; // usually expressed via template

Не могу вспомнить, что говорит об этом C ++ 03, но в C ++ 0x результирующий тип при работе с ссылками rvalue критичный. Ссылка rvalue на тип T, где T является ссылочным типом, становится ссылкой типа T.

(std::string&)&& ref // ref is std::string&
(const std::string&)&& ref // ref is const std::string&
(std::string&&)&& ref // ref is std::string&&
(const std::string&&)&& ref // ref is const std::string&&

Рассмотрим простейшую функцию шаблона - min и max. В C ++ 03 вы должны перегружать все четыре комбинации констант и не константы вручную. В C ++ 0x это всего лишь одна перегрузка.

template<typename A, typename B> auto min(A&& aref, B&& bref) {
    // for example, if you pass a const std::string& as first argument,
    // then A becomes const std::string& and by extension, aref becomes
    // const std::string&, completely maintaining it's type information.
    if (std::forward<A>(aref) < std::forward<B>(bref))
        return std::forward<A>(aref);
    else
        return std::forward<B>(bref);
}

Я отказался от вывода типа возврата, потому что я не могу вспомнить, как это делается из рук в руки, но этот min может принимать любую комбинацию lvalues, rvalues , const lvalues.

0
задан MattEnth 16 January 2019 в 22:59
поделиться