C++ 为什么这个操作符不在后面的返回类型中使用?

C++ 为什么这个操作符不在后面的返回类型中使用?,c++,c++11,operator-keyword,language-lawyer,trailing-return-type,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确实接受了我的代码。我的代码实际上是无效的吗?看来,这是CLang的错误,因为下一个代码 struct A { int operator[](int); auto at(int i) ->

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

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

Clang说我的类没有操作符[]。Gcc确实接受了我的代码。我的代码实际上是无效的吗?

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

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

也按叮当声编译-$6

只是为了重复我和Stephane的评论:

这是clang中的一个明显错误,因为您的类显然有一个
操作符[](int)

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

我会说,由于13.3.1.2p3(第一个子弹),叮当声是正确的

对于一元运算符
@
,其操作数类型的cv非限定版本为
T1
,对于二进制运算符 运算符
@
,具有cv非限定版本为
T1的类型的左操作数和类型的右操作数
其cv不合格版本为
T2
,三套候选函数,指定成员候选,非成员 候选对象和内置候选对象的构造如下:

  • 如果
    T1
    是完整的类类型,则成员候选集是
    T1::operator@
    (13.3.1.1.1);否则,成员候选集为空


(强调由@sehe添加)

这可能是,但这不是证据。今晚有人对我说,这不是叮当声,但我记不起原因:-(你能给我一段确凿的线索,证明叮当声行为是错误的吗?@Johanneschaub litb他们说了为什么不是叮当声吗?:)@你问一句话来证明叮当声的行为是错误的。。。。我不能。。。但是我发现你问了很多问题,至少Clang的错误信息是完全错误的:我很明显在你的类中看到了一个操作符[]。老实说,我不知道在这个特殊情况下Clang是对还是错,但是它是否能与表单
(*this)一起工作。操作符[](I)
,不能与表单
(*this)[I]
-这是错误提示应该正确的地方,
在声明成员函数时不可用,仅在成员函数内部可用。(§9.3.2/1“在非静态(9.3)成员函数的主体中,关键字
this
是一个prvalue表达式[…])。@xeo我不同意。作为最后一分钟的更改,马德里的委员会在一个尾随返回类型中使用了这个有效的方法,以便于继承封闭成员函数的常量。如果clang说没有
操作符[](int)
,这显然是错误的。那么问题是什么?关于使用此
的有效性问题是另一个问题。我同意Johannes的观点,它在这里必须是有效的。所以,问题是:你能在decltype中使用
这个
来返回方法吗?@Bjo不,我的问题是这个代码是否有效。一般来说,clang接受在尾部返回类型中使用“this”,因此我不确定应该更准确地问什么。我重新编写了这个问题。我对错误消息的措辞是否正确并不感兴趣。我更感兴趣的是我的代码是否是C++。对不起,如果我的措辞引起混乱。许多无效的C++代码会触发无意义的错误消息:顺便说一下:-一些更突出的候选是当你忘记某个类型名时。- 1:因为错误。p3不适用于
操作员[]
。p3仅适用于
@a
形式的运算符,其中
@
是一元运算符。操作员[]不是;它由一个单独的部分管理。只有超链接的答案是错误的。你似乎把它提升到了一个全新的水平!这种联系被设计破坏了。你能至少引用一下相关的文字吗?@Nicol Bolas相当不错。我完全没有注意到[]是由另一个部门处理的。谢谢你帮我澄清。@nicol我不同意。运算符[]是一个二进制运算符,其中@是[]IMHO。例如,内置项的项目符号也提到运算符->。那么,在OP中声明“at”时,类“A”被认为是不完整的吗?($9.2/2)