Разница между & amp; и std :: add_lvalue_reference [дубликат]

Интерфейс подобен контракту, в котором вы хотите, чтобы ваш класс реализации реализовал методы, написанные в контракте (интерфейс). Поскольку Java не предоставляет множественное наследование, программирование для интерфейса является хорошим способом достижения цели множественного наследования. Если у вас есть класс A, который уже расширяет какой-либо другой класс B, но вы хотите, чтобы класс A также следовал определенным рекомендациям или реализовывал определенный контракт, тогда вы можете сделать это путем программирования стратегии интерфейса.

8
задан Uroc327 21 August 2015 в 18:37
поделиться

3 ответа

  • add_cv_t<T> и const volatile T
  • add_const_t<T> и const T
  • add_volatile_t<T> и volatile T

Нет разницы; определение add_const<T>::type является, например, только T const.

  • add_lvalue_reference_t<T> и T&
  • add_rvalue_reference_t<T> и T&&

T& и T&& плохо сформированы, когда T - cv void, но эти шаблоны хорошо сформированы,

  • add_pointer_t<T> и T*?

add_pointer_t<T> эквивалентно std::remove_reference<T>::type*. То есть, если T является ссылочным типом, он дает указатель на ссылочный тип. С другой стороны, T* будет плохо сформирован, так как вы не можете иметь указатель на ссылку.

Что вы должны использовать?

  • В общем, псевдоним шаблоны могут использоваться для предотвращения вычета T. Конечно, это означает, что если вы хотите дедукции, вы должны избегать их.
  • Шаблоны псевдонимов могут использоваться в качестве аргументов шаблона шаблона для шаблона, который принимает преобразование типа в качестве параметра.
  • Шаблоны псевдонимов, которые отличаются поведением от альтернатив, таких как T*, полезны в общем коде, поскольку они «делают правильные вещи». Например, если T выводится из аргумента типа T&&, тогда T* делает неправильную вещь, когда аргумент является lvalue, поскольку он пытается объявить указатель на ссылку lvalue. Но std::add_pointer_t<T> даст указатель на фактический тип аргумента.
11
ответ дан Brian 22 August 2018 в 19:00
поделиться

В большинстве случаев std::add_rvalue_reference_t<T> эквивалентно T&&. Тем не менее, правила свертывания ссылок и the-rules-that-dictate-which-types-are-referenceable могут иметь ваш код, если он не учитывается.

, в некоторых случаях, когда тип статического члена type будет отличаться, поскольку T является не ссылочным типом. Например, std::add_rvalue_reference_t<void> разрешает void и (используя другой шаблон, который вы упомянули в качестве примера) std::add_pointer_t<T&> разрешает T* (если вы хотите вызвать хаос, требуемый ритуал std::add_pointer_t<std::add_rvalue_reference_t<void>>:))

Уважая использование, его можно использовать в качестве параметра шаблона шаблона, чтобы сделать какую-то чертову черную магию. Во всяком случае, такие вещи, как std::is_rvalue_reference_t<T> или std::remove_reference_t<T> , обычно чаще используются при манипулировании ссылочными атрибутами типа.

0
ответ дан 3442 22 August 2018 в 19:00
поделиться
  • 1
    О, извините, я неправильно понял эту часть. Просто исправил это :). – 3442 21 August 2015 в 19:16
  • 2
    Просто лучше сказать «вероятно». скорее утверждать то, что может (каким-то образом) не быть. Суть этого и «его мнение» заключается в том, что ОП не указывает, что (или, вернее, why ) он / она делает. Это простая теория? Вернее, как я это называю, «черная магия»? Мы не знаем, и правила обращения с коллапсом могут в значительной степени повлиять на то, неправильно ли его / ее код (если не принимать во внимание). – 3442 21 August 2015 в 19:24
  • 3
    Кстати, я снова отредактировал. С предыдущим правлением первый абзац стал бессмысленным, и поэтому у Барри была своя точка с ним. – 3442 21 August 2015 в 19:26
  • 4
    Как шаблоны псевдонимов влияют на свертывание ссылок? – Uroc327 21 August 2015 в 20:58
  • 5
    Вы, вероятно, имели в виду «как ссылочный коллапс влияет на шаблонные шаблоны?», Который сам по себе должен быть перефразирован до «как ссылочное сведение влияет на шаблоны?». Ну, ответ немного сложный и должен быть рассмотрен по другому вопросу. – 3442 21 August 2015 в 22:21

В соответствии с тем, что я вижу в источнике STL:

add_cv_t<T> и const volatile T - нет разницы

add_const_t<T> и const T - никакой разницы

add_volatile_t<T> и volatile T - нет разницы

add_lvalue_reference_t<T> и T& - существует разница, например, если T не является ссылочным типом void. add_lvalue_reference_t<void>::type = void и void& = ошибка времени компиляции

add_rvalue_reference_t<T> и T&& - то же, что и выше

add_pointer_t<T> и T* - разность, когда T потому что нет указателя на ссылку. add_pointer_t<T> эквивалентно std::remove_reference<T>::type*

3
ответ дан Elohim Meth 22 August 2018 в 19:00
поделиться
  • 1
    Интересно, в чем причина этого ответа? – Elohim Meth 21 August 2015 в 21:00
  • 2
    Ошибка времени компиляции является неопределенной. В некоторых реализациях ошибка не возникает – 陳 力 5 June 2018 в 14:40
Другие вопросы по тегам:

Похожие вопросы: