【问题标题】:static_cast required when using std::get with enum class使用带有枚举类的 std::get 时需要 static_cast
【发布时间】:2019-06-04 12:48:59
【问题描述】:

根据c++ referencestd::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 classes 的主要特点:它们禁止从整数类型到整数类型的隐式转换。
  • 这是enum classenum的主要区别...enum class不能隐式转换为任何其他类型,您需要显式转换。
  • @francesco 你可以写 std::tuple a = {};

标签: c++ templates implicit-conversion stdtuple


【解决方案1】:

这是因为enum class(相对于简单的enum)不能隐式转换为数字类型。您需要显式地转换它以获得数值,例如使用static_cast&lt;&gt;()

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多