为什么这个运算符在尾随返回类型中的用法不能编译?

时间:2013-01-21 09:23:23

标签: c++ c++11 operator-keyword language-lawyer trailing-return-type

我试图在另一个函数的尾随返回类型中重用运算符的返回类型,但不幸的是clang不接受它

struct A {
  int operator[](int);
  auto at(int i) -> decltype((*this)[i]);
};

Clang说我班上没有算子[]。 Gcc确实接受了我的代码。我的代码实际上是无效的吗?

3 个答案:

答案 0 :(得分:3)

看来,这是CLang的错误,因为下一个代码

struct A {
  int operator[](int);
  auto at(int i) -> decltype( this-> operator[]( i ) );
};

由CLang编写 - http://liveworkspace.org/code/2Myghk $ 6

答案 1 :(得分:3)

我认为铿锵是正确的,因为13.3.1.2p3(第1个子弹)。

  

对于具有cv非限定版本为@的类型的操作数的一元运算符T1,以及对于二进制   运算符@,其左操作数的类型为cv非限定版本为T1,右操作数为类型   其cv-nonqualified版本为T2,三组候选函数,指定成员候选者,非成员   候选人和内置候选人的构建如下:

     
      
  • 如果T1是完整的类类型,则候选成员集是合格查找的结果   T1::operator@(13.3.1.1.1);否则, 成员候选人名单为空
  •   

(重点由@sehe添加)

答案 2 :(得分:2)

只是为了重新审视我和Stephane的评论:

这是clang中的一个明显错误,因为你的班级显然有一个operator[](int)

使用decltype()的代码是否有效,是一个微妙的不同问题 (我会说这是有效的,但无法证明)。