【发布时间】:2019-06-04 12:48:59
【问题描述】:
根据c++ reference,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 classes 的主要特点:它们禁止从整数类型到整数类型的隐式转换。 -
这是
enum class与enum的主要区别...enum class不能隐式转换为任何其他类型,您需要显式转换。 -
@francesco 你可以写 std::tuple
a = {};
标签: c++ templates implicit-conversion stdtuple