Использование declval со ссылочным типом

Я вижу несколько примеров кода, в которых тип, используемый для создания экземпляра функции шаблона, указан как ссылочный тип, а не просто тип, как в:

      std::declval<T &>()

в отличие от:

      std::declval<T>()

где Tэто какой-то тип. Мне не хватает тонкости, почему обозначение ссылки может быть выбрано вместо простого типа. Не мог бы кто-нибудь объяснить мне это?

я знаю это std::declval расширяется до typename std::add_rvalue_reference<T>::type но мне все еще не хватает причины, по которой можно было бы создать последний экземпляр со ссылкой на тип, а не на сам простой тип.

1 ответ

Из-за сворачивания ссылок результат будет другим (см. Ответ, который я дал в комментарии ), и это имеет последствия.

Подумайте о том, что членские функции могут быть &&/ &/ const& квалифицированный, например.

Ниже приводится простой, хотя, вероятно, бессмысленный пример того, как передача T против T& к std::declval может иметь «решительный» эффект.

      #include <type_traits>
struct A{};
struct B{};

struct C {
    A f() && { return A{}; }
    B f() const & { return B{}; }
};
int main() {
    static_assert(std::is_same_v<A, decltype(std::declval<C>().f())>);
    static_assert(std::is_same_v<B, decltype(std::declval<C&>().f())>);
}
Другие вопросы по тегам