Использование 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())>);
}