1. ホーム
  2. c++

[解決済み] if constexpr()」と「if()」の違い。

2022-03-06 12:48:59

質問

とはどのような違いがあるのでしょうか? if constexpr()if() ?

その両方はいつどこで使えるのですか?

解決方法は?

唯一の違いは if constexpr はコンパイル時に評価されるのに対し if はありません。つまり、分岐はコンパイル時に拒否される可能性があり、その結果、コンパイルされることはないのです。


ある関数があるとします。 length を持つ型の長さを返すものです。 .length() 関数を使用します。一つの関数でやると、コンパイラから文句を言われます。

template<typename T>
auto length(const T& value) noexcept {
    if (std::integral<T>::value) { // is number
        return value;
    else
        return value.length();
}

int main() noexcept {
    int a = 5;
    std::string b = "foo";

    std::cout << length(a) << ' ' << length(b) << '\n'; // doesn't compile
}

エラーメッセージを表示します。

main.cpp: In instantiation of 'auto length(const T&) [with T = int]':
main.cpp:16:26:   required from here
main.cpp:9:16: error: request for member 'length' in 'val', which is of non-class type 'const int'
     return val.length();
            ~~~~^~~~~~

それは、コンパイラがインスタンス化するときに length というように、この関数は次のようになります。

auto length(const int& value) noexcept {
    if (std::is_integral<int>::value) { // is number
        return value;
    else
        return value.length();
}

valueint を持たないので length メンバ関数があるため、コンパイラが文句を言うのです。コンパイラは、このステートメントが決して int しかし、コンパイラはそれを保証することはできないので、問題ではない。

これで length しかし、多くの型(この場合、すべての数値とクラスが length

if constexpr

if