代码之家  ›  专栏  ›  技术社区  ›  Bernard

是否仍计算丢弃分支中的嵌套constexpr if语句?

  •  11
  • Bernard  · 技术社区  · 6 年前

    #include <tuple>
    #include <type_traits>
    
    template <size_t I>
    int test() {
        if constexpr(I != 0) {
            return 0;
        }
        else { // This branch is discarded, but it seems that the constexpr-if below is still evaulated?
            if constexpr(std::is_same_v<int, std::tuple_element_t<I, std::tuple<int>>>) { // some constexpr check that is valid only when I == 0
                return 1;
            }
            else {
                return 2;
            }
        }
    }
    
    int main() {
        test<1>();
        return 0;
    }
    

    std::tuple_element_t I

    根据 cppreference

    GCC和Clang似乎也毫无问题地接受了这段代码(在编译器资源管理器上测试)。

    (另外,如果标准不能保证代码所做的工作,是否还有其他方法来完成嵌套的constexpr if语句?)

    1 回复  |  直到 6 年前
        1
  •  12
  •   Rakete1111    6 年前

    GCC和Clang是对的。会的。 如果被丢弃分支中唯一未被丢弃的语句是 if constexpr

    [stmt.if]p2

    如果转换条件的值为 ,第一个子项是 ,否则是第二个子项,如果 丢弃的语句 如果条件在实例化后不依赖于值,则 (如果有)不是

    else { /*... * } .该分支中的任何内容都未实例化,因此编译器不允许实例化任何内容,因此通过实例化MSVC是错误的 std::tuple_element<I, std::tuple<int>>