2017-12-19 1 views
3
#include <iostream> 

int foo(int x) { 
    if constexpr (std::is_same_v<decltype(x), std::string>) { 
     x = std::string(); 
    } 
} 

int main(void) 
{ return 0; } 

であれば:constexprのこのコードはGCC 7もクラン5のいずれかにコンパイルされない非テンプレートタイプ

error: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘int’ in assignment 
     x = std::string(); 

falseに評価すべきブランチ場合、参照ラインがconstexprの中にあるので、プログラムをコンパイルしてはいけませんか?

+0

これは期待された動作ですが、驚くほど十分です。 'constexpr'がこのように動作しない場合、テンプレートパラメータの場合のみ(大まかに) – Justin

+0

[this](https://stackoverflow.com/q/46512248/2069064)または[this](https:// stackoverflow)を参照してください。 com/q/47000914/2069064) – Barry

+1

私はあなたに同意します。あなたが書いたコードが動作するように指定されていなかった理由は分かりません。私はそれが驚くべきことだと思う。ビルド設定やターゲット固有の設定など、望ましいことがあるのは確かです。 – Justin

答えて

2

if constexpr仕様では、の廃棄文が定義されています。次に、インスタンス化の後で、結果が値に依存しない場合、破棄された文がインスタンス化されないことを定義します。テンプレートのインスタンス化中にステートメントが破棄されるということです。さらに、条件付き値がテンプレート引数に依存する場合にのみ、ステートメントは破棄されます。

関連する問題