2016-12-05 6 views
28

C++ 1zは、 "constexpr if"を導入します。ifは条件に基づいて分岐の1つを削除します。合理的かつ有用であると思われる。"constexpr if" vs "if"(最適化あり) - なぜ "constexpr"が必要ですか?

しかし、constexprキーワードなしではできませんか?私はコンパイル時にコンパイラがコンパイル時に気分状態がわかっているかどうかを知っておくべきだと思います。そうであれば、最も基本的な最適化レベルでさえ不要な分岐を削除する必要があります。例えば

(godboltで参照:https://godbolt.org/g/IpY5y5を):

int test() { 
    const bool condition = true; 
    if (condition) { 
     return 0; 
    } else { 
     // optimized out even without "constexpr if" 
     return 1; 
    } 
} 

Godboltエクスプローラショー、-O0でさえGCC-4.4.7をコンパイル "1を返す"、そう、それはで約束されたものを達成しなかったことconstexpr if。明らかに、このような古いコンパイラは、条件がconstexpr関数の結果であるときにそうすることはできませんが、現実のままです:現代のコンパイラは、条件がconstexprかどうかを知っており、明示的にそれを伝える必要はありません。

そこで質問です:

なぜ "場合constexprの" に必要な "constexprのは、" ありますか?

+7

最適化の問題だけでなく、 'constexpr if'のデッドブランチが無効であることが許されます。つまり、それ自身ではコンパイルされません。あなたの質問は立っている。 – Quentin

答えて

38

これは、例を使用して簡単に説明できます。 if文の両方のブランチは、よく形成する必要があるため

struct Cat { void meow() { } }; 
struct Dog { void bark() { } }; 

template <typename T> 
void pet(T x) 
{ 
    if(std::is_same<T, Cat>{}){ x.meow(); } 
    else if(std::is_same<T, Dog>{}){ x.bark(); } 
} 

考えてみましょう

pet(Cat{}); 
pet(Dog{}); 

を呼び出すと、コンパイルエラー(wandbox example)がトリガされます。

prog.cc:10:40: error: no member named 'bark' in 'Cat' 
    else if(std::is_same<T, Dog>{}){ x.bark(); } 
            ~^
prog.cc:15:5: note: in instantiation of function template specialization 'pet<Cat>' requested here 
    pet(Cat{}); 
    ^
prog.cc:9:35: error: no member named 'meow' in 'Dog' 
    if(std::is_same<T, Cat>{}){ x.meow(); } 
           ~^
prog.cc:16:5: note: in instantiation of function template specialization 'pet<Dog>' requested here 
    pet(Dog{}); 
    ^

if constexpr

template <typename T> 
void pet(T x) 
{ 
    if constexpr(std::is_same<T, Cat>{}){ x.meow(); } 
    else if constexpr(std::is_same<T, Dog>{}){ x.bark(); } 
} 

を使用するようpetを変更するだけで解析可能であることを枝を要求する - 条件に一致する唯一のブランチは(wandbox example)整形式である必要があります。予想通り

スニペット

pet(Cat{}); 
pet(Dog{}); 

は、コンパイルして動作します。

+1

ありがとうございます。 "parseable"と "well-formed"の区別は私の前に私を逃しました:-) – MateuszL

関連する問題