繁体   English   中英

c样式类型转换和operator()

[英]c-style type cast and operator()

问题已更改!

我使用一种简单的方法从本地名称空间隐藏枚举-结构内部的枚举。 它大致是这样的:

struct Color
{
    enum Type
    {
        Red, Green, Black
    };
    Type t_;
    Color(Type t) : t_(t) {}
    operator Type () const {return t_;}
private:
  template<typename T>
  operator T () const;
};

运算符T()是对隐式类型强制转换的保护。 然后,我尝试使用gcc和keil编译此代码:

Color n;
int a[9];
a[ (int)n ] = 1;

gcc编译它没有错误(这是我所期望的),但是Keil给了我一个错误:“无效的类型转换。操作符()不可访问”。

所以我的问题是:哪个编译器正确?

我知道c ++ 11枚举类,但现在Keil不支持

reinterpret_cast(不是c-style()强制转换)应该调用类型转换运算符吗?

否, reinterpret_cast仅用于一些不可靠的转换类型:

  • 将指针转换为整数然后返回
  • 在指针(和引用)之间转换为不相关的类型

您根本不需要强制转换即可使用隐式转换运算符-您根本没有阻止隐式转换。 在C ++ 11中,如果运算符是explicit ,则需要static_cast

如果您坚持使用C ++ 03,并且确实要防止隐式转换但允许显式转换,那么我认为唯一明智的做法是提供一个命名转换函数。

更新 :问题现在已经更改,正在询问有关C样式的强制转换,而不是reinterpret_cast 应该编译该代码,因为static_cast可以完成的任何转换(包括隐式转换)也可以使用C样式转换进行。

暂无
暂无

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

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