std::declval
е помощна програма по време на компилиране, използвана за конструиране на израз с цел определяне на неговия тип. Дефинира се така:
template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;
Няма ли да е по-просто?
template< class T >
T declval() noexcept;
Какво е предимството на референтния тип връщане? А не трябва ли да се казва declref
?
Най-ранният исторически пример, който намирам, е n2958, който извиква функцията value()
, но вече винаги връща препратка.
Обърнете внимание, че операндът на decltype
не е необходимо да има достъпен деструктор, т.е. не се проверява семантично като пълен израз.
template< typename t >
t declprval() noexcept;
class c { ~ c (); };
decltype ( declprval< c >() ) * p = nullptr; // OK
T
да може да се копира, за да можеT
да бъде валиден тип връщане?T &&
би избегнал това. - person user2357112 supports Monica   schedule 07.09.2014