gpt4 book ai didi

c++ - 不允许用返回非常量引用的方法覆盖返回常量引用的虚方法

转载 作者:行者123 更新时间:2023-12-01 13:56:04 26 4
gpt4 key购买 nike

以下代码编译:

struct Ret {};

struct A
{
virtual const Ret& fun() = 0;
};

struct B : public A
{
Ret& fun() override
{
static Ret ret;
return ret;
}
};

int main()
{
B b;
}
如何在编译期间禁止使用不同的 const 说明符作为返回类型的覆盖方法返回引用?
提前致谢。

最佳答案

以下所有标准引用均指N4659: March 2017 post-Kona working draft/C++17 DIS .

派生函数的返回类型需要与它覆盖的函数的返回类型协变,反之则不然
[class.virtual]/7 管理[提取,重点矿]:

The return type of an overriding function shall be either identicalto the return type of the overridden function or covariant with theclasses of the functions. If a function D​::​f overrides afunction B​::​f, the return types of the functions are covariant ifthey satisfy the following criteria:

  • [...]
  • (7.3) both pointers or references have the same cv-qualification and the class type in the return type of D​::​f has the samecv-qualification as or less cv-qualification than the class type inthe return type of B​::​f.

使得下面的程序是格式良好的
struct Ret {};

struct A {
virtual const Ret& fun() = 0;
};

struct B : public A {
Ret& fun() override { /* ... */ }
};

int main() {}
我们可能会注意到 A::fun 的多态用法底层接口(interface) B object 将强制接口(interface)的返回类型为常量,而以下程序格式错误:
struct Ret {};

struct A {
virtual Ret& fun() = 0;
};

struct B : public A {
const Ret& fun() override { /* ... */ }
};

int main() { }
附带以下指导性编译器错误消息(Clang)
error: return type of virtual function 'fun' is 
not covariant with the return type of the
function it overrides

这个要求很自然,因为我们可能注意到,如果接口(interface) A将允许多态调用非常量 Ret& -返回 fun()即使派生对象将重载实现为返回 const Ret& ,那么我们就有办法修改 const对象(通过多态),这是未定义的行为。

有自然的变通方法(例如,用 Curiosly Recurring Template Pattern 替换动态多态性,以及在注入(inject)基础的派生类型上的 constness 断言),但可以说这些似乎都解决了 an XY problem。并且可能实现只会增加代码复杂性而没有任何明显 yield 的模式。

关于c++ - 不允许用返回非常量引用的方法覆盖返回常量引用的虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63576417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com