[英]Strange behavior in GCC: rvalue ref and lvalue ref are covariant return types
我有一小段代码:
struct Res { };
struct A {
virtual Res &&foo();
};
struct B : A {
Res &foo() override;
};
它在 GCC 中编译,但不在 Clang: https://godbolt.org/z/65rffW中编译。
根据此处引用的标准语言,左值引用不是右值引用的协变返回类型。
为什么 GCC 不发出错误?
这实际上是一份标准缺陷报告的主题,一份相当古老的报告:
- 协变函数和左值/右值引用部分:11.7.3 [class.virtual] 状态:CD2 提交者:James Widman 日期:2009 年 9 月 1 日
[在 2010 年 3 月的会议上投票加入 WP。]
11.7.3 [class.virtual] 第 5 段要求协变返回类型既可以是指针也可以是引用,但它没有指定引用必须是左值引用或右值引用。 想必这是一个疏忽。
提议的决议(2010 年 2 月):
将 11.7.3 [class.virtual] 第 5 段项目符号 1 更改如下:
...如果 function D::f 覆盖 function B::f,则如果函数的返回类型满足以下条件,则它们是协变的:
- 都是指向类的指针,都是对类的左值引用,或者都是对类的右值引用106
...
来自http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#960
该代码无疑是格式错误的,Clang 和 MSVC(至少)确实解决了这个问题,而 GCC 没有。
我提交了一个错误报告: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99664
更新:
该错误已修复, 测试用例在这里。 将包含在 gcc 12 中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.