static_cast 使用 std::get 与枚举类时必需的

static_cast required when using std::get with enum class

本文关键字:枚举 get cast 使用 std static      更新时间:2023-10-16

根据 c++ 参考,std::get 的模板参数是一个std::size_t。当这样的参数是基类型为 std::size_tenum class而不是隐式转换时,为什么需要显式强制转换?

请参阅以下示例

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

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