18

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

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

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

4

3 回答 3

3

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

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

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

于 2013-01-21T09:44:40.313 回答
3

由于 13.3.1.2p3(第一个项目符号),我会说 clang 是正确的。

对于具有@cv 非限定版本为 的类型的操作数的一元运算符,以及具有 cv 非限定版本为的类型的左操作数和 cv 非限定版本为的类型的右操作数T1的二元运算符,三个候选函数集、指定成员候选函数、非成员候选函数和内置候选函数的构造如下:@T1T2

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

(@sehe 强调)

于 2013-01-21T10:33:57.997 回答
2

只是为了重申我和斯蒂芬的评论:

这是 clang 中的一个明显错误,因为您的课程显然有一个operator[](int).

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

于 2013-01-21T10:18:02.083 回答