繁体   English   中英

C ++显式积分用户定义的转换

[英]C++ explicit integral user-defined conversion

我有一个flags类,女巫只是一个整数的包装器,我想根据基础整数类型的转换规则将显式转换为任意整数类型。

说我有上课的方式(忽略无关的成员)

class Flags {
    unsigned int v;
    explicit operator unsigned int() { return v; }
}

除了int说,我还能转换为整数吗?

unsigned long long iflags = static_cast<unsigned long long>(flags);

而不是

unsigned long long iflags = static_cast<unsigned int>(flags);

还是我需要为每种整数类型显式定义一个转换运算符才能做到这一点?

注意我正在使用C ++ 14

我已经阅读了http://en.cppreference.com/w/cpp/language/cast_operator,但是看不到特定于整数类型的任何东西,这使我认为我需要显式定义所有想要避免的有效转换。 我也对模板转换函数感到满意,如果无法转换为目标类型,该函数将失败,请注意,我知道内部整数的最大值,即所有标志位均已打开,作为宏/常量FLAGS_MAX ,如果这样做有什么用。

除了int说,我还能转换为整数吗?

 unsigned long long iflags = static_cast<unsigned long long>(flags); 

不,你不能。

以上等同于:

unsigned long long temp(flags);
unsigned long long iflags = temp;

第一行是错误的,因为不能将flags隐式转换为unsigned long long

给定Flags的定义,初始化iflags的唯一合法C ++方法是使用:

 unsigned long long iflags = static_cast<unsigned int>(flags);

如果从转换运算符中删除explicit限定词

class Flags {
    unsigned int v;
    public:
       operator unsigned int() { return v; }
}

那么你可以使用

unsigned long long iflags = static_cast<unsigned long long>(flags);

static_cast尝试属于[expr.static.cast] / 4 ,它粗略地说,如果可以执行T t(e);则可以执行static_cast<T>(e) T t(e); 对于某些发明的变量t (在措辞中有一些有趣的舞蹈,可以保证有保证的省略和C样式的转换奇数,我们可以忽略它们。)

该初始化由[dcl.init] /17.7控制 ,它表示您对Flags的转换函数进行重载解析,并带有指向[over.match.conv]的指针,该指针对候选者有这样的说明:

那些未隐藏在[ Flags ]中并产生类型[ unsigned long long ]或可以通过标准转换序列转换为类型[ unsigned long long ]的类型的非显式转换函数是候选函数。 对于直接初始化,未隐藏在[ Flags ]中并产生类型[ unsigned long long ]的显式转换函数或可以通过限定转换转换为类型[ unsigned long long ]的类型也是候选函数。

您的explicit operator unsigned int()既不会产生unsigned long long也不会产生可通过限定转换将其转换为类型的类型(此处无关紧要-转换仅适用于指针y的事物); 因此,它不是候选人。 由于候选集为空,因此重载解析失败,因此初始化static_cast不正确, static_cast也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM