在枚举类上使用std :: get时需要static_cast

时间:2019-06-04 12:48:59

标签: c++ templates implicit-conversion stdtuple

根据c++ referencestd::get的模板参数为std::size_t。为什么当这样的参数是基本类型为enum class的{​​{1}}而不是隐式转换时,为什么需要显式转换?

请参阅以下示例

std::size_t

取消注释该行会导致编译错误(gcc 7.3.0)

#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;
}

1 个答案:

答案 0 :(得分:2)

这是因为enum class(与简单的enum相反)不能隐式转换为数字类型。您需要明确地将其强制转换以获取数字值,例如使用static_cast<>()