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.
2条答案
按热度按时间i2byvkas1#
当你使用
if constexpr
时,没有被采用的分支(如果条件是true
,则是else
;如果条件是false
,则是第一条语句)变成了一条被丢弃的语句,并获得了3个“特殊能力”。if constexpr (B)
,而您有一个模板头template<bool B>
),则在示例化专门化时,丢弃的分支根本不会示例化。字符串
auto
类型推断:型
当然,不同之处在于
if (x)
不会强制x
成为常量表达式,而if constexpr (x)
是。所以在非模板环境下,与
constexpr bool kOn = false;
没有太大区别。编译器仍然会检查两个分支,看看它们是否使用if constexpr
编译。tzdcorbm2#
不,两个
if
不相等。第一个分支是在运行时计算的,它的两个分支中的代码必须在编译时格式良好。
第二个分支是在编译时计算的,它的未使用的分支中的代码可能是病态的,因为它的死代码被编译器删除了。
if constexpr
不依赖于模板。