【发布时间】:2018-04-18 21:19:52
【问题描述】:
参考下面Proposing Standard Library Support for the C++ Detection Idiom中的例子:
// primary template handles types that do not support pre-increment
template< class, class = void_t<> >
struct
has_pre_increment_member : false_type { };
// specialization recognizes types that do support pre-increment
template< class T >
struct
has_pre_increment_member<T, void_t<decltype( ++declval<T&>() )>> : true_type { };
表达式++declval<T&>() 是如何归类为未评估的?
在上面,假设declval() 返回T&,正如Is there a reason declval returns add_rvalue_reference instead of add_lvalue_reference
中所讨论的那样,表达式++T&(由++declval<T&> 产生)的结果是否会变为odr-used 而不是未评估?根据ODR-use:
如果一个引用被使用并且它的所指对象在 编译时间;
在上述情况下,不是编译时不知道所指对象吗?在这种情况下,引用如何首先与declval() 一起使用?
【问题讨论】:
-
我认为
decltype()中的任何内容都未经评估。 -
这是
std::declval的point。您可以在decltype中将anything 变魔术,因为它仅用于查找表达式的type