Правильный способ сравнить BitmaskType с нулем?

Согласно BitmaskType Концепция, реализация должна гарантировать, что следующее утверждение хорошо поддается корректировке: (перечислено в §17.5.2.1.3.4)

Значение Y устанавливается в объекте X, если выражение X & Y ненулевой.

где X и Y имеют концептуальный тип BitmaskType,

При попытке следующего простого фрагмента кода с gcc 4.7 я получаю ошибки вывода шаблона:

#include <future>

int main() {
(std::launch::async & std::launch::async) != 0;
}

Ошибка:

error: no match for 'operator!=' in '(std::launch)1 != 0'
... followed by tons of deduction errors

Это ошибка в gcc, или я просто что-то здесь не так? Если да, как правильно выполнить такую ​​проверку?

Я уже проверил список ошибок gcc, но не смог найти что-либо, касающееся этой темы.

2

Решение

Члены enum классы не предназначены для преобразования в int неявно или наоборот. Вы можете убедиться, что ваш тип битовой маски преобразован в int или используйте нулевое значение enum учебный класс. Я думаю, что последнее предпочтительнее:

(std::launch::async & std::launch::async) != std::launch()

(Я также добавил скобки вокруг побитового and операция, поскольку она имеет более высокий приоритет, чем сравнение, и это не имеет большого смысла для побитового and логическое значение с типом битовой маски).

Самый простой способ убедиться в этом — 7.2 [enum.dcl] параграф 9:

… Обратите внимание, что это неявное преобразование перечисления в int не предусмотрено для перечисления с областью видимости: …

Это, однако, в рамках ненормативного примера. Отслеживание правил для определенных в стандарте правил может потребовать исключения всех случаев, когда преобразования разрешены, и в настоящее время это упражнение не совсем подходит.

4

Другие решения

Других решений пока нет …