std::d eclval 和未计算的表达式



参考为C++检测习惯用法提供标准库支持中的以下示例:

// 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&如是否有原因 declval 返回add_rvalue_reference而不是add_lvalue_reference,表达式 ++T& 的结果(由 ++declval<T&> 产生(不会变成 ODR 使用而不是未计算吗?根据 ODR 用途:

如果使用引用,则引用是 ODR 使用的,并且其引用在 编译时;

上述情况下,引用对象在编译时不是不知道吗?在这种情况下,如何首先将引用与declval()一起使用?

表达式如何分类++declval<T&>()为未计算?

因为它在decltype()范围内:

decltype说明符的操作数是未计算的操作数。

函数、

变量、结构化绑定、赋值运算符或构造函数等必须出现在潜在计算的表达式中才能使用 odrdecltype()不符合该标准。

相关内容

  • 没有找到相关文章

最新更新