Согласно 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, но не смог найти что-либо, касающееся этой темы.
Члены enum
классы не предназначены для преобразования в int
неявно или наоборот. Вы можете убедиться, что ваш тип битовой маски преобразован в int
или используйте нулевое значение enum
учебный класс. Я думаю, что последнее предпочтительнее:
(std::launch::async & std::launch::async) != std::launch()
(Я также добавил скобки вокруг побитового and
операция, поскольку она имеет более высокий приоритет, чем сравнение, и это не имеет большого смысла для побитового and
логическое значение с типом битовой маски).
Самый простой способ убедиться в этом — 7.2 [enum.dcl] параграф 9:
… Обратите внимание, что это неявное преобразование перечисления в int не предусмотрено для перечисления с областью видимости: …
Это, однако, в рамках ненормативного примера. Отслеживание правил для определенных в стандарте правил может потребовать исключения всех случаев, когда преобразования разрешены, и в настоящее время это упражнение не совсем подходит.
Других решений пока нет …