【问题标题】:c-style type cast and operator()c 风格的类型转换和 operator()
【发布时间】:2013-05-16 07:12:49
【问题描述】:

问题改了!

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

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 不支持它

【问题讨论】:

  • g++ 和 clang++ 都没有为我编译这段代码,即使在修复了 Color n; 的定义之后。
  • 您使用的是什么版本的 g++?有什么错误?
  • invalid cast from type ‘Color’ to type ‘int’: GCC 4.6.3、4.7.2、4.8.0; reinterpret_cast from 'Color' to 'int' is not allowed:铿锵3.3
  • 现在很有趣。我实际上将这个东西与宏一起使用并且它确实编译了。但是我尝试了这个简单的 sn-p 并没有。我糊涂了。 UPD:是的,c 风格的转换在 g++ 中有效,但在 Keil 中无效。我应该在提问之前测试代码:(问题应该是关于 C 风格的转换
  • 我不确定这是否与它有关,但在 stackoverflow.com/questions/573294/when-to-use-reinterpret-cast 上我发现了这条评论,“在 C++03 中,int* 到 void* 的演员被禁止用 reinterpret_cast 来完成(尽管编译器没有实现它并且不切实际,因此针对 C++11 进行了更改)”。由于结构涉及指向对象的指针。可能 Keil 不喜欢它的原因是因为那个 C++03 标准。

标签: c++ gcc keil


【解决方案1】:

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

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

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

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

如果你被 C++03 卡住了,并且你真的想阻止隐式转换但允许显式转换,那么我认为唯一明智的做法是提供一个命名转换函数。

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

【讨论】:

  • 那么将运算符设为私有不会使隐式转换成为不可能吗? o_o
  • 仍然感谢您的回答,我已经自己猜到了命名函数,但操作员会更直接。我希望 reinterpret_cast 只是......好吧,毫无疑问地解释内存块。
  • @Amomum:不; operator Type() 是公共的,Type 可以用作数组索引。
  • @Amomum:这就是reinterpret_cast 所做的;但是您需要转换为引用 (reinterpret_cast&lt;int&amp;&gt;) 才能重新解释内存,并且由于类型不匹配,您会得到未定义的行为。
  • 投一个参考?! o_O 这是我第一次听到。感谢您之前的评论,但根本不使用类型转换在 Keil 中不起作用(很奇怪) - 它尝试使用模板运算符并失败。
猜你喜欢
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
相关资源
最近更新 更多