为什么'declval'根据'add_rvalue_reference<T>::type'而不是"T&&"来指定?
Why is 'declval' specified in terms of 'add_rvalue_reference<T>::type' and not 'T&&'?
§20.2.4 [declval]
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept; // as unevaluated operand
为什么在此处使用add_rvalue_reference
?
从§20.9.7.2 [meta.trans.ref]
到add_rvalue_reference
:
如果
T
命名对象或函数类型,则成员typedeftype
应命名为T&&
;否则,type
应命名为T
。[注意:此规则反映引用折叠的语义(8.3.2)。例如,当类型T
命名类型T1&
时,类型add_rvalue_reference<T>::type
不是右值引用。--结束注释]
既然add_rvalue_reference
无论如何都是用来反映引用崩溃的,为什么不像下面这样使用T&&
呢?
template<class T>
T&& declval();
可能出了什么问题?这两个版本到底有什么不同?
我不知道这是否是实际原因,但add_rvalue_reference
对void
有不同的行为。
CCD_ 17简称为CCD_。
void&&
是一个错误。
几个定义取决于declval
,为cv合格void
给出合理的结果。一个例子是is_assignable
:
template <class T, class U>
struct is_assignable;
表达
declval<T>() = declval<U>()
在处理时形成良好作为未求值的操作数。。。
其意图是,"良好形式"指的是赋值表达式的良好形式,而不是declval<T>
本身是否良好形式。也就是说,我们一次只想担心一件事。
区别在于add_rvalue_reference<>
只有在T
是对象或函数类型的情况下才真正添加&&
部分。如果T
不是对象或函数类型(例如void
),则不希望添加&&
。
请参阅Ideone上的此示例
Boost实现的这个网页解释道:
函数模板
declval()
的作用是在不使用或评估该函数的情况下将类型T
转换为值。该名称应该将读者的注意力引导到表达式declval<T>()
是左值的事实上,当且仅当T
是左值引用,否则是右值。为了扩展此函数的域,我们可以通过将其声明更改为来做得更好template<class T> typename std::add_rvalue_reference<T>::type declval(); // not used
这保证了我们也可以使用cv
void
作为模板参数。
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 将内存分配返回值强制转换为 TYPE 数组
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- reference_wrapper导致"incomplete type is not allowed"
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 为什么'declval'根据'add_rvalue_reference<T>::type'而不是"T&&"来指定?