繁体   English   中英

GCC 中的奇怪行为:rvalue ref 和 lvalue ref 是协变返回类型

[英]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 不发出错误?

这实际上是一份标准缺陷报告的主题,一份相当古老的报告:

  1. 协变函数和左值/右值引用部分: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM