Синтаксис switch ( condition ) statement
с условием
- любое выражение целого или типа перечисления или типа класса контекстуально неявно , преобразуемое вцелочисленный тип или тип перечисления, или объявление единственной переменной, не являющейся массивом, такого типа с инициализатором скобки или равенства.
Взят из cppreference.
Это означает, что вы можете использовать регистр переключения только для целых чисел или перечислений типа .Чтобы компилятор мог неявно преобразовывать Wrapper в целочисленный / перечислимый тип, вам нужно удалить явное ключевое слово:
Явный спецификатор указывает, что конструктор или функция преобразования (начиная с C ++ 11) не 't разрешить неявные преобразования
Вы также можете привести Wrapper к типу int.
Изменить по адресу @ acraig5075 примечания:
Вы должны быть осторожны, какой оператор явный ичто подразумевается.Если оба являются неявными, код не будет компилироваться, потому что будет неопределенность:
struct Wrapper
{
operator int() { return 0; }
operator bool() { return true; }
};
source_file.cpp: В функции 'int main ()': source_file.cpp: 12: 14:
ошибка: неоднозначное преобразование типов по умолчанию из 'Wrapper'
switch (w) {
^ source_file.cpp: 12: 14: примечание: преобразование кандидатов
включают 'Wrapper :: operator int ()' и 'Wrapper :: operator bool ()'
Единственный способ устранить неоднозначность - это выполнить приведение.
Если только один из операторов является явным, для оператора switch будет выбран другой оператор:
#include <iostream>
struct Wrapper
{
explicit operator int() { return 0; }
operator bool() { return true; }
};
int main()
{
Wrapper w;
if (w) { /** this line compiles **/std::cout << " if is true " << std::endl; }
switch (w) {
case 0:
std::cout << "case 0" << std::endl;
break;
case 1:
std::cout << "case 1" << std::endl;
break;
}
return 0;
}
Вывод:
if is true
case 1
w
неявно преобразован в 1
(true
) (так как оператор int является явным) и выполняется случай 1.
С другой стороны:
struct Wrapper
{
operator int() { return 0; }
explicit operator bool() { return true; }
};
Выход:
if is true
case 0
w
был неявно преобразован в 0
, поскольку оператор bool является явным.
В обоих случаях оператор if равен true, поскольку w
оценивается контекстно для логического значения внутри оператора if.