什么是直接定义转换函数以引用数组的ISO C ++方法?

时间:2010-04-10 22:40:09

标签: c++ operator-overloading

根据标准,转化函数有一个函数ID operator conversion-type-id ,看起来像operator char(&)[4]我相信。但我无法弄清楚函数参数列表的放置位置。 gcc不接受operator char(&())[4]operator char(&)[4]()或我能想到的任何内容。

现在,gcc似乎接受(&operator char ())[4]但是clang不接受,而且我也倾向于不接受,因为它似乎不符合我所理解的语法。

我不想使用typedef,因为我想避免使用它来污染命名空间。

2 个答案:

答案 0 :(得分:9)

您可以使用身份

template<typename T>
struct identity { typedef T type; };

struct sample {
  operator identity<char[4]>::type &() {
    ...
  }
};

你是正确的,函数和数组声明符在转换函数中不起作用。这也是this issue report中已知和讨论的。但是我认为C ++ 0x已经提供了他们在那里讨论的解决方案

struct sample {
  template<typename T>
  using id = T;

  template<typename T, int N>
  operator id<T[N]> &() {
    ...
  }
};

identitytypedef方法不同,我认为这可以推导TN

答案 1 :(得分:4)

C ++没有为此提供语法。当 为类型使用typedef-name时,这就是其中一种情况。

为了避免污染命名空间,在类中声明typedef-name是完全可以的

struct S {
  int a[4];

  typedef int A[4];
  operator A&() { return a; }
};