我试图在另一个函数的尾随返回类型中重用运算符的返回类型,但不幸的是clang不接受它
struct A {
int operator[](int);
auto at(int i) -> decltype((*this)[i]);
};
Clang说我班上没有算子[]。 Gcc确实接受了我的代码。我的代码实际上是无效的吗?
答案 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()
的代码是否有效,是一个微妙的不同问题
(我会说这是有效的,但无法证明)。