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/