Рассмотрим следующий класс:Оператор noexcept и enable_if_t: они работают вместе?
struct S {
template<typename T>
std::enable_if_t<std::is_void<T>::value>
f() noexcept {}
template<typename T>
std::enable_if_t<not std::is_void<T>::value>
g() noexcept {}
};
Как и следовало ожидать, это компилирует:
s.f<void>();
Это один не вместо:
s.g<void>();
озадачивает меня в том, что следующий main
компилируется GCC (6.2) и не компилируется с помощью clang (3.9):
int main() {
static_assert(noexcept(&S::f<void>), "!");
static_assert(noexcept(&S::g<void>), "!");
}
Я бы сказал, что второе утверждение потерпело неудачу из-за недействительной специализации. Эти два компилятора не согласны с этим.
Какой именно?
Я думаю, что GCC решил сделать ярлык, как только выяснилось, 'g' является шаблоном функции-члена и поэтому' noexcept' может быть только 'true'. –
@ T.C. Это может быть, но в этом случае специализация недействительна. Должен ли он не сбой для 'S :: g' (скажем так) _cannot exist_ на самом деле? –
skypjack
Я не сказал, что GCC прав. –