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

最佳答案

“在 decltype 中没有为返回对象类型的纯右值的函数引入临时”规则仅适用于函数调用本身是 decltype 的操作数或逗号运算符的右操作数,即 0x2518122212r [§3exp. .call]/p11),这意味着在 OP 中给定 decltype

template< typename t >
t declprval() noexcept;

class c { ~ c (); };

int f(c &&);

decltype(f(declprval<c>())) i;  // error: inaccessible destructor

不编译。更一般地,返回 declprval 将阻止 T 的大多数非平凡使用与不完整的类型、带有私有(private)析构函数的类型等:
class D;

int f(D &&);

decltype(f(declprval<D>())) i2;  // doesn't compile. D must be a complete type

这样做并没有什么好处,因为 xvalues 与 prvalues 几乎没有区别,除非您在它们上使用 declval,并且您通常不会直接在 0x25181223134314 的返回值上使用 decltype - 你已经知道类型1。

关于c++ - 为什么 std::declval 添加引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25707441/

10-14 09:28