static_cast требуется при использовании std :: get с классом enum - PullRequest
0 голосов
/ 04 июня 2019

Согласно справке c ++ , параметр шаблона std::get равен std::size_t.Зачем нужен явный приведение, когда таким параметром является enum class с базовым типом std::size_t вместо неявного преобразования?

См. Следующий пример

#include <tuple>

enum class labels : std::size_t { red, green, blue };

int main()
{
  std::tuple<int, int, double> a;
  // std::get<labels::red>(a) = 0;
  std::get<static_cast<std::size_t>(labels::red)>(a) = 0;
  std::get<static_cast<std::size_t>(labels::green)>(a) = 0;
  std::get<static_cast<std::size_t>(labels::blue)>(a) = 0;

  return 0;
}

Раскомментированиестрока вызывает ошибку компиляции (gcc 7.3.0)

tuple.cpp:8:26: error: could not convert template argument ‘red’ from ‘labels’ to ‘long unsigned int’
   std::get<labels::red>(a) = 0;

1 Ответ

2 голосов
/ 04 июня 2019

Это потому, что enum class (в отличие от простого enum) не может быть косвенно преобразовано в числовой тип.Вам нужно явно привести его к числовому значению, например, используя static_cast<>().

...