static_cast 在 class 上使用转换运算符
static_cast on class with conversion operator
我刚刚遇到这种行为,我很难理解为什么这不起作用。
enum class TestEnum
{
Foo,
Bar
};
class MyClass
{
public:
operator TestEnum()
{
return m_enum;
}
TestEnum m_enum = TestEnum::Foo;
}
MyClass theClass;
int enumValue = static_cast< int >( theClass ); // does not work, conversion operator not called
int enumValue = static_cast< int >( static_cast< TestEnum >( theClass ) ) // works as expected
我知道编译器只允许 1 次隐式转换,这里我认为只有一次从 MyClass 到 TestEnum 的隐式转换,然后是一次显式转换。
确实允许一种隐式转换。然而:
static_cast< int >( theClass )
这是一些非 int
class 类型到 int
的转换。这不是首先转换为某种未指定的类型,然后才转换为 int
。这是一次转化。
因此,如果存在一个到 int
的隐式转换,那么这是允许的。但是这里没有一个到 int
的隐式转换。
静态转换运算符不只是从一个类型转换到另一个类型无论如何应该在源和目标之间定义一个关系 type.a 可以看出在 myclass 和 testenum 类型之间存在关系并且因此,定义两种类型之间关系的转换运算符被调用,定义整数类型和testenum类型之间关系的转换运算符是called.but 我的class和int之间没有直接关系类型,因此编译器看不到任何可用于转换类型的转换运算符,因此代码行将不起作用。
我刚刚遇到这种行为,我很难理解为什么这不起作用。
enum class TestEnum
{
Foo,
Bar
};
class MyClass
{
public:
operator TestEnum()
{
return m_enum;
}
TestEnum m_enum = TestEnum::Foo;
}
MyClass theClass;
int enumValue = static_cast< int >( theClass ); // does not work, conversion operator not called
int enumValue = static_cast< int >( static_cast< TestEnum >( theClass ) ) // works as expected
我知道编译器只允许 1 次隐式转换,这里我认为只有一次从 MyClass 到 TestEnum 的隐式转换,然后是一次显式转换。
确实允许一种隐式转换。然而:
static_cast< int >( theClass )
这是一些非 int
class 类型到 int
的转换。这不是首先转换为某种未指定的类型,然后才转换为 int
。这是一次转化。
因此,如果存在一个到 int
的隐式转换,那么这是允许的。但是这里没有一个到 int
的隐式转换。
静态转换运算符不只是从一个类型转换到另一个类型无论如何应该在源和目标之间定义一个关系 type.a 可以看出在 myclass 和 testenum 类型之间存在关系并且因此,定义两种类型之间关系的转换运算符被调用,定义整数类型和testenum类型之间关系的转换运算符是called.but 我的class和int之间没有直接关系类型,因此编译器看不到任何可用于转换类型的转换运算符,因此代码行将不起作用。