P0292R1 constexpr if został included, na ścieżce dla C++ 17. Wydaje się przydatna (i może zastąpić użycie SFINAE), ale komentarz odnośnie static_assert
jest źle sformułowane, nie diagnostyczny wymagane w fałszywym gałęzi mnie przeraża:constexpr if i static_assert
Disarming static_assert declarations in the non-taken branch of a
constexpr if is not proposed.
void f() {
if constexpr (false)
static_assert(false); // ill-formed
}
template<class T>
void g() {
if constexpr (false)
static_assert(false); // ill-formed; no
// diagnostic required for template definition
}
Rozumiem, że jest to całkowicie zabronione w użyciu static_assert
wewnątrz constexpr jeśli (przynajmniej fałszywa/niepobrana gałąź, ale w praktyce oznacza to, że nie jest to bezpieczne ani użyteczne).
Jak to się dzieje ze standardowego tekstu? W tekście propozycji nie znalazłem żadnej wzmianki o static_assert
, a funkcje constexpr w C++ 14 zezwalają na static_assert
(szczegóły na cppreference: constexpr).
Czy ukrywa się w tym nowym zdaniu (po 6.4.1)? :
Kiedy constexpr if pojawia się w matrycy podmiotu, podczas konkretyzacji szablonu otaczającej lub rodzajowy lambda, porzucony oświadczenie nie jest tworzony.
Stamtąd, zakładam, że jest również zakazane, bez diagnostyki konieczne, aby wywołać inne constexpr (szablon) funkcje, które gdzieś dół wykresu połączeń może wezwać static_assert
.
Konkluzja:
Jeśli moje rozumienie jest poprawne, nie dość, że umieścić sztywny limit na bezpieczeństwo i przydatność constexpr if
jak mielibyśmy wiedzieć (z dokumentacji lub inspekcji kodu) o dowolnej korzystanie z static_assert
? Czy moje zmartwienia są błędne?
Aktualizacja:
Ten kod kompiluje bez ostrzeżenia (głową clang 3.9.0), ale jest moim rozumieniu źle sformułowane, nie wymaga diagnostyki. Ważny czy nie?
template< typename T>
constexpr void other_library_foo(){
static_assert(std::is_same<T,int>::value);
}
template<class T>
void g() {
if constexpr (false)
other_library_foo<T>();
}
int main(){
g<float>();
g<int>();
}
To źle sformułowane, ponieważ warunek jest fałszywy. Nie dlatego, że jest wewnątrz constexpr, jeśli ... – immibis
@immibis. Oczywiste jest, że chodzi o nieprzyjętą gałąź, więc nie rozumiem, co konkretnie masz na myśli. Czy starasz się opracować i zinterpretować w kategoriach pytania końcowego? –
clang już zaimplementowano 'if constexpr'. Jeśli masz jakiekolwiek wątpliwości, dlaczego nie spróbować [wypróbować go sam] (http://melpon.org/wandbox/permlink/8AmTzaSIIUi4M1kY)? – cpplearner