C++ 中 if/else 分支的编译时消除

Compile-time elimination of if/else branch in C++

在下面的代码示例中,if 语句依赖于 bool 模板参数,它是一个编译时常量。编译器以不同方式处理此代码:

问题是哪种行为符合标准(或者它是未定义的行为并且两者都以自己的方式正确)?

#include <iostream>

template<const bool condition>
struct Struct
{
    void print()
    {
        if (condition)
        {
            std::cout << "True\n";
        }
        else
        {
            printIfFalse();
        }
    }

private:
    void printIfFalse();
};

template <>
void Struct<false>::printIfFalse()
{
    std::cout << "False\n";
}

int main()
{
    Struct<true> withTrue{};
    withTrue.print();

    Struct<false> withFalse{};
    withFalse.print();

    return 0;
}

所有编译器都正确运行。

您的程序格式错误,不需要诊断,因为您通过调用所需的 Struct<true>::print() 实例化使用 Struct<true>::printIfFalsewithTrue.print();。在 废弃语句 之外使用的函数必须在程序中有定义,请参阅 [basic.def.odr]/4,否则程序 格式错误,无需诊断.

丢弃的语句 是您在模板中使用 if constexpr 并且该语句不在所选分支中时得到的结果。因此,要使程序合式,您可以使用 if constexpr 而不是 if。这是 C++17 的特性。