【发布时间】:2014-10-31 16:19:17
【问题描述】:
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 &&会避免这种情况。 -
我认为是为了支持不能按值返回的类型,例如函数类型、数组类型和抽象类。
-
@user2357112:可移动性就足够了。
-
@Mehrdad 任何类类型都可以是返回类型,可移动性是不必要的。
-
@Potatoswatter:我从没说过可移动性是必要的。