0

分岐がヒットするはずでない場合にconstexprが失敗するとコンパイラが強制的に失敗するような方法はありますか?ビジュアルスタジオを停止する17分岐したときに悪いconstexprを打つときにコンパイルする

以下、このコードは、私ができるよりも良いそれをすべて説明:

template<unsigned int number_base> 
class arithmetic_type 
{ 
    if constexpr(number_base == 0 || number_base == 1) 
    { 
     //hey, compiler! fail this compilation please 
    } 
    else 
    { 
     //go on with class implementation 
    } 

} 
+0

static_assert(1 == 0) '? – user463035818

+2

1つの分岐がヒットしないと仮定した場合のconstexpr分岐のポイントは何ですか?ブランチ条件を 'static_assert'に入れてください。 – VTT

+0

私は静的アサーションについてどう考えなかったのか分かりません – Evan

答えて

3

あなたはstatic_assert()をしたいです。この場合は、あなたがif constexprをドロップすることができ、ちょうど直接主張:

template<unsigned int number_base> 
class arithmetic_type 
{ 
    static_assert(number_base != 0 && number_base != 1); // or >= 2, since unsigned 
    //go on with class implementation 
}; 

しかし、一般的に、あなただけのstatic_assert(false)を必要とする場所があるかもしれません。しかし、それは非形式的な条件付きであるため、アサーションは常にトリガされます。その場合、依存するように見えるものを提供する必要がありますが、実際にはそうではありません。

// always false, but could hypothetically be specialized to be true, but 
// nobody should ever do this 
template <class T> struct always_false : std::false_type { }; 

static_assert(always_false<SomeDependentType>::value); 
+0

constexprで 'static_assert(false)'も無効ですか? – Jarod42

+0

@ Jarod42うん。 'if constexpr'は、破棄されたサブステートメントがインスタンス化されるのを防ぎます*。しかし、 'static_assert(false)'でインスタンス化が必要なものはありません。 – Barry

関連する問題