c风格的类型转换和运算符()

时间:2013-05-21 13:32:19

标签: c++ gcc keil

问题已经改变了!

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

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

1 个答案:

答案 0 :(得分:4)

  

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

不,reinterpret_cast仅用于一些狡猾的转换类型:

  • 将指针转换为整数并返回
  • 将指针(和引用)转换为不相关的类型

您根本不需要使用隐式转换运算符 - 您根本没有阻止隐式转换。在C ++ 11中,如果运算符为explicit,那么您需要static_cast

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

更新:问题现在已经改变,并且询问C风格的投射而不是reinterpret_cast。这应该编译,因为static_cast可以完成的任何转换(包括隐式转换)也可以使用C风格的转换来完成。