【问题标题】:Why doesnt this operator usage in the trailing return type compile?为什么不编译尾随返回类型中的此运算符用法?
【发布时间】:2013-01-04 07:54:25
【问题描述】:

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

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

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

【问题讨论】:

  • Clang 应该是对的,this 在成员函数声明时不可用,它只在成员函数内部可用。 (§9.3.2/1 “在非静态 (9.3) 成员函数的主体中,关键字 this 是纯右值表达式 [...]”)。
  • @xeo 我不同意。作为最后一分钟的更改,马德里的委员会在尾随返回类型中使用 this 有效,以方便继承封闭成员函数的常量。
  • 如果clang说没有operator[](int),那显然是错的。那么问题是什么?关于在此处使用this 的有效性问题是一个不同 的问题。我同意 Johannes 的观点,它必须在这里有效。
  • 那么,问题真的是:你可以在 decltype 中使用this 来返回方法吗?
  • @Bjo 不,我的问题是这段代码是否有效。 clang 通常接受在尾随返回类型中使用“this”,所以我不确定我应该更准确地问什么。

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


【解决方案1】:

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

对于一元运算符 @,其操作数的类型为 cv 非限定版本为 T1,对于二元运算符 运算符 @ 的左操作数的类型为 cv 非限定版本为 T1,右操作数的类型为 其cv-unqualified版本为T2,三组候选函数,指定成员候选,非成员 候选和内置候选的构造如下:

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

(强调由@sehe添加)

【讨论】:

  • -1:因为错了。 p3 不适用于operator[]。 p3 仅适用于@a 形式的运算符,其中@ 是一元运算符。运算符 [] 不是;它由一个单独的部分管理。
  • 只有超链接的答案不好。你似乎把它带到了一个全新的水平!此链接被设计破坏。您能否至少引用相关文字?
  • @Nicol Bolas 确实如此。我完全错过了 [] 由另一个部分处理。感谢您直言不讳。
  • @nicol 我不同意。 operator[] 是二元运算符,其中 @ 是 [] 恕我直言。例如,内置的项目符号还提到了 operator->.
  • 那么,在 OP 中的“at”声明中,“A”类是否被认为是不完整的? ($9.2/2)
【解决方案2】:

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

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

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

【讨论】:

  • 我改写了这个问题。我对错误消息的措辞是否真的很感兴趣。我对我的代码是否是有效的 C++ 更感兴趣。如果我的措辞引起了混乱,我很抱歉。
  • 许多无效的 c++ 代码会触发无意义的错误消息,顺便说一下 :-) 一些更突出的候选者是当你忘记某个地方的类型名时。
【解决方案3】:

看来,是CLang的bug,因为下一段代码

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

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

【讨论】:

  • 可能是这样,但这不是证据。
  • 今晚有人对我说这不是clang错误,但我不记得原因了:-(你能给出证明clangs行为错误的段落的结论性痕迹吗?
  • @JohannesSchaub-litb 他们有没有说为什么它不是一个clang错误? :)
  • @JohannesSchaub-litb 你问了一个句子来证明 CLang 的行为是错误的......好吧我不能......但我发现你问得很多时 至少错误信息Clang 完全错了:我显然在你的课堂上看到了一个运算符 []。
  • 老实说,我不知道在这种特殊情况下 CLang 是对还是错,但如果它可以与 (*this).operator[]( i ) 形式一起使用并且不能与 (*this)[ i ] 形式一起使用 - 这是恕我直言一个错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2019-02-04
  • 2013-11-21
相关资源
最近更新 更多