【发布时间】:2018-12-02 23:28:24
【问题描述】:
我正在尝试完全理解if constexpr。
我了解,如果if constexpr(expr) 用在模板中,而expr 依赖于模板参数,那么在实例化过程中,只会实例化then/else 分支中的一个,另一个将被实例化被丢弃。
我有两个问题:
- 如果
expr不依赖于模板参数,那么if constexpr(expr)的任何分支都不会被丢弃,这是真的吗?如果是,标准在哪里这样说?我看不出标准在哪里有异常丢弃仅在expr依赖时发生。 -
if constexpr在模板之外有用吗?如果是,这个的用例是什么?你能举一些例子来理解它的用处吗?
【问题讨论】:
-
我会说是的,因为它可以取代通常使用预处理器的
#ifdef的特征选择结构。 -
@HenriMenke:“问题”是(如我所见),在模板之外,不会丢弃任何分支。所以我真的不明白
if constexpr的意义。一个简单的if会(几乎)做同样的事情。 -
只有 MSVC 在没有实例化的情况下才会完全丢弃分支。 godbolt.org/z/Zg1-PB
-
@HenriMenke 即使它从未实例化,分支中的代码仍然必须在语法上有效。但是iirc不需要诊断,所以gcc、clang和MSVC在这里都是正确的……
标签: c++ c++17 constexpr if-constexpr template-instantiation