static_cast 使用 std::get 与枚举类时必需的
static_cast required when using std::get with enum class
根据 c++ 参考,std::get
的模板参数是一个std::size_t
。当这样的参数是基类型为 std::size_t
的enum 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<>()
。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 作用域枚举和标准::get
- static_cast 使用 std::get 与枚举类时必需的
- 使用 set 和 get 的 c++ 中的枚举
- std::get<0>(...) 和枚举索引
- std::get 使用枚举类作为模板参数
- 重载枚举索引数组的std::get