【发布时间】:2021-06-16 06:31:05
【问题描述】:
我有这段小代码:
struct Res { };
struct A {
virtual Res &&foo();
};
struct B : A {
Res &foo() override;
};
它在 GCC 中编译,但不在 Clang 中:https://godbolt.org/z/65rffW。
根据引用的标准语言here,左值引用不是右值引用的协变返回类型。
为什么 GCC 不发出错误?
【问题讨论】:
-
这不是一个复杂的问题。假设这是不正确的,根据 C++ 标准,这只能是编译器错误或编译器扩展。我不知道有任何 gcc 对此效果的扩展。因此,逻辑规则得出结论,这一定是编译器错误?
-
@A.Hristov stackoverflow.com/questions/8610571/…
-
@A.Hristov 表示该函数是为右值对象类型定义的,但此处不需要 - 即使使用普通函数也可以重现该错误。
-
@SergeyA 在代码中删除了 this 的右值引用,这是激发问题的真实代码的剩余部分。
标签: c++ gcc g++ language-lawyer