gpt4 book ai didi

c++ - SFINAE: 'static_cast()' 或 ', void()'?

转载 作者:可可西里 更新时间:2023-11-01 17:57:40 30 4
gpt4 key购买 nike

在任意类型上执行 SFINAE 时,通常需要将表达式的结果转换为 void。我见过两种方法;转换为无效:

(void)(expr)    // or static_cast<void>(expr)

或者,或者,使用带有 void prvalue RHS 的逗号运算符:

(expr), void()

据我了解,在这两种情况下,expr 都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类 T 也无法覆盖 T::operator void()operator,(T, void)。 (参见:Why is "operator void" not invoked with cast syntax?What does the 'void()' in 'auto f(params) -> decltype(..., void())' do?)。

也就是说,这两个习语是否等效,或者在任何情况下应该优先选择另一个(可能是非标准编译器)?如果不是,是否有任何理由(例如可理解性)偏爱其中一个?

最佳答案

他们都满足需要的要求:

  • 要求 expr 作为丢弃值表达式有效,
  • 始终具有类型 void(用于尾随返回类型或 partial specializations)

因此,在考虑上述标准时,这些方法是等效的。牢记这一点,我建议您使用代码中更简洁的内容;但无论您选择什么,都要坚持下去以保持一致性。
还可以使用函数式样式转换,因为根据定义,当只有一个参数时,它等同于显式转换符号 - 即

auto g(auto f) -> decltype(void( f(1, 2, 3) ));

也有效。

关于c++ - SFINAE: 'static_cast<void>()' 或 ', void()'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28837332/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com