C++ if constexpr使用constexpr bool等价于普通if?

ojsjcaue  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(82)

如果被检查的条件变量被标记为constexpr,那么下面的代码片段在功能上是否等效?
另外,这是if constexpr的正确用法,还是它在模板化上下文中的预期应用。

constexpr bool kOn = false;

// Snippet 1
if (kOn) { return true; }

// Snippet 2
if constexpr (kOn) { return true; }

字符串

i2byvkas

i2byvkas1#

当你使用if constexpr时,没有被采用的分支(如果条件是true,则是else;如果条件是false,则是第一条语句)变成了一条被丢弃的语句,并获得了3个“特殊能力”。

  • 如果它在模板中,并且条件是依赖于值的(例如,if constexpr (B),而您有一个模板头template<bool B>),则在示例化专门化时,丢弃的分支根本不会示例化。
  • 丢弃的分支中的实体仍然是odr使用的,但不需要定义:
int x();
int main() {
    if constexpr (false) x();  // Does not require a definition of x
    if (false) x();  // Requires a definition of x
}

字符串

  • 丢弃的分支中的Return语句不影响auto类型推断:
auto f() {
    if constexpr (false) return 0;
    return 0L;
}  // OK: auto deduced as long

auto g() {
    if (false) return 0;
    return 0L;
}  // Error: two return statements with different types.


当然,不同之处在于if (x)不会强制x成为常量表达式,而if constexpr (x)是。
所以在非模板环境下,与constexpr bool kOn = false;没有太大区别。编译器仍然会检查两个分支,看看它们是否使用if constexpr编译。

tzdcorbm

tzdcorbm2#

不,两个if不相等。
第一个分支是在运行时计算的,它的两个分支中的代码必须在编译时格式良好。
第二个分支是在编译时计算的,它的未使用的分支中的代码可能是病态的,因为它的死代码被编译器删除了。
if constexpr不依赖于模板。

相关问题