0

Y at-il un moyen de forcer le compilateur à échouer si une branche constexpr si n'est pas censée être touchée?stop visual studio 17 compiler quand je frappe un mauvais constexpr si branche

ce code ci-dessous explique tout mieux que moi:

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

Quel est le point de branchement constexpr si une branche n'est pas supposée être touchée? Mettez juste la condition de branche dans 'static_assert'. – VTT

+0

Je ne sais pas comment je ne pensais pas à l'assertion statique – Evan

Répondre

3

Vous voulez static_assert(). Dans ce cas, vous pouvez déposer les if constexpr et juste affirmes directement:

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 
}; 

Mais en général, il peut y avoir des endroits où vous avez juste besoin static_assert(false). Mais cela est mal formé, cette affirmation serait toujours déclenchée parce que c'est un conditionnel non dépendant. Dans ce cas, vous devez fournir quelque chose qui semble dépendant mais qui ne l'est pas:

// 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

Est-ce que static_assert (false) est également invalide dans constexpr if? – Jarod42

+0

@ Jarod42 Ouais. 'si constexpr' empêche la sous-instance rejetée d'être * instanciée *. Mais il n'y a rien qui ait besoin d'être instancié dans 'static_assert (false)'. – Barry