0

问题变了!

我使用一种简单的方法将我的枚举隐藏在本地命名空间中——在结构中进行枚举。大致是这样的:

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;
};

operator T () 是对隐式类型转换的保护。然后我尝试用 gcc 和 keil 编译这段代码:

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

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

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

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

4

1 回答 1

4

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

不,reinterpret_cast仅用于几种不可靠的转换类型:

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

您根本不需要强制转换来使用隐式转换运算符 - 您根本没有阻止隐式转换。在 C++11 中,如果运算符是explicit,那么你需要一个static_cast.

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

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

于 2013-05-21T13:43:28.377 回答