假设有一个这样的枚举:
enum foo: int {
first,
second
}
然后我按如下方式使用它:
foo f(1); // error: cannot initialize a variable of type 'foo' with an rvalue of type 'int'
foo f = foo(1); // OK !
我想知道两者有什么区别?
我知道第二个版本可以被视为功能风格的转换,但是为什么这有什么不同呢?
例如,如果我这样做:
class Bar {};
Bar b = Bar(1); // no matching conversion for functional-style cast from 'int' to 'Bar'
我显然得到了一个有道理的错误。因此,这让我相信,为了使上面的 foo 示例的第二个版本能够工作,必须从int
to enum
在某处定义,但如果存在这样的转换,那么为什么我在第一个版本中会收到错误?
如果这是重复的,我深表歉意。我怀疑是这样。
这似乎相关:这是演员还是建筑? https://stackoverflow.com/questions/7612006/is-this-a-cast-or-a-construction...但不放弃。
提前致谢 !
是的,这两种形式有很大的不同,而且有微妙的不同。让我们看看第一个,它会导致错误。这是初始化f
,类型foo
,从一个int
。这里描述了,重点是我的:
[dcl.init]/17.8 http://eel.is/c++draft/dcl.init#17.8
否则,被初始化的对象的初始值为
初始化表达式的(可能已转换)值。标准
如有必要,将使用转换, 转换初始化器
目标类型的 cv 未限定版本的表达式;不
考虑用户定义的转换。如果无法转换
完成后,初始化格式错误.
在这种情况下相关的转换是整数转换,主要是由以下指定的转换:
[转化积分]/1 http://eel.is/c++draft/conv.integral#1
无作用域枚举类型的纯右值可以转换为
整数类型的纯右值。
因此,无范围枚举可以隐式转换为整数,但反之则不然。这就是初始化格式错误的原因。然而,函数式强制转换表示法本质上是静态强制转换。还有一个静态转换可以执行(几乎)任何有效标准转换的逆操作 http://eel.is/c++draft/expr.static.cast#7.sentence-1。所以选角的1
然后用于初始化f
,但此时我们正在从 a 进行复制初始化foo
prvalue,这当然完全没问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)