Я написал черту is_incrementable
так:
#include <type_traits>
template <typename T, typename = void>
struct is_incrementable : std::false_type {};
template <typename T>
struct is_incrementable<T, std::void_t<decltype(++std::declval<T&>())>>
: std::true_type {};
template <typename T>
constexpr bool is_incrementable_v = is_incrementable<T>::value;
Когда я применяю его к bool
с -std=c++17
на Clang, он возвращает true
:
// This compiles
static_assert(is_incrementable_v<bool>, "");
Но увеличение bool
не разрешено в c ++ 17. Действительно, если я пытаюсь это сделать, я получаю сообщение об ошибке:
bool b = false;
++b;
Результат:
error: ISO C++17 does not allow incrementing expression of type bool [-Wincrement-bool]
Почему SFINAE сообщает, что bool
является инкрементным, когда компилятор явно не позволяет это?
Проводник компилятора: https://godbolt.org/g/DDFYBf