Требуется ли static_assert
сбой при обработке выражения с неправильным форматом, не требующим диагностики (IFNDR), или компилятор может игнорировать его и успешно передать static_assert
, поскольку диагностика не требуется...?
В следующем коде есть несколько случаев IFNDR. GCC, Clang и MSVC различаются в своих результатах для static_assert
:
template<typename T> concept A = T::value || true;
template<typename U> concept B = A<U*>;
template<typename V> concept C = A<V&>;
int main(){
static_assert(B<int&>); // clang and msvc rejects gcc accepts, ill-formed (int&*)
static_assert(C<void>); // clang and msvc rejects gcc accepts, ill-formed (void&)
}
The question popped up following this recent interesting question: C++20 Concepts: Constraint Normalization. For explanation and a reference to the spec, regarding concepts-constraint-normalization that create an ill-formed expression follow the above link.
INFDR — это, ну, IFNDR, сразу же при анализе идентификатора концепта. Это не SFINAE, где какой-то контекст может «зафиксировать» сбой и отреагировать на него.
Таким образом, это означает, что в приведенном выше коде поведение GCC допустимо, программа плохо сформирована, и вы не можете ничего ожидать.