Почему SFINAE не дает правильный результат для увеличения bool? - PullRequest
0 голосов
/ 24 июня 2018

Я написал черту 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

...