我试图在另一个函数的尾随返回类型中重用运算符的返回类型,但不幸的是,clang 不接受它
struct A {
int operator[](int);
auto at(int i) -> decltype((*this)[i]);
};
Clang 说我的班级没有 operator[]。Gcc 确实接受了我的代码。我的代码实际上无效吗?
我试图在另一个函数的尾随返回类型中重用运算符的返回类型,但不幸的是,clang 不接受它
struct A {
int operator[](int);
auto at(int i) -> decltype((*this)[i]);
};
Clang 说我的班级没有 operator[]。Gcc 确实接受了我的代码。我的代码实际上无效吗?
看来,这是 CLang 的错误,因为下一个代码
struct A {
int operator[](int);
auto at(int i) -> decltype( this-> operator[]( i ) );
};
也由 CLang 编译 - http://liveworkspace.org/code/2Myghk $6
由于 13.3.1.2p3(第一个项目符号),我会说 clang 是正确的。
对于具有
@
cv 非限定版本为 的类型的操作数的一元运算符,以及具有 cv 非限定版本为的类型的左操作数和 cv 非限定版本为的类型的右操作数T1
的二元运算符,三个候选函数集、指定成员候选函数、非成员候选函数和内置候选函数的构造如下:@
T1
T2
- 如果
T1
是一个完整的类类型,则该成员候选集是T1::operator@
(13.3.1.1.1)的合格查找的结果;否则,成员候选集为空。
(@sehe 强调)
只是为了重申我和斯蒂芬的评论:
这是 clang 中的一个明显错误,因为您的课程显然有一个operator[](int)
.
使用的代码decltype()
是否有效,是一个微妙的不同问题(我会说它是有效的,但不能证明它)。