eca*_*mur 8 c++ void decltype sfinae
在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void.我已经看到了两种方法; 演员无效:
(void)(expr) // or static_cast<void>(expr)
Run Code Online (Sandbox Code Playgroud)
或者,使用带有void prvalue RHS的逗号运算符:
(expr), void()
Run Code Online (Sandbox Code Playgroud)
我的理解是,在两种情况下都要expr评估(对于良好的形式,在非评估的上下文中)和结果(或结果类型,在非评估的上下文中)被丢弃; 在任何一种情况下,即使是病理类也不可能T覆盖T::operator void()或operator,(T, void).(参见:为什么是"运营商无效"不投语法调用?,什么的'无效()'中的'自动F(PARAMS) - > decltype(...,无效())'呢?).
也就是说,这两个成语是等价的,还是在某种情况下,一个人应该优先于另一个(可能是非标准的编译器)?如果没有,是否有任何理由(例如可理解性)偏好一个而不是另一个?
它们都满足所需的要求:
expr作为丢弃值表达式有效,仅此而已。void(用于尾随返回类型或部分特化)因此,当考虑上述标准时,这些方法是等效的。记住这一点,我建议在代码中使用更简洁的内容;但无论你选择什么,都要坚持下去以保持一致性。
人们还可以使用函数式风格转换,因为根据定义,它相当于只有一个参数时的显式转换表示法 - 即
auto g(auto f) -> decltype(void( f(1, 2, 3) ));
Run Code Online (Sandbox Code Playgroud)
也有效。
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |