繁体   English   中英

我可以在覆盖虚函数的返回类型中丢失“constness”吗?

[英]Can I lose “constness” in the return type of an override virtual function?

以下代码编译并运行,并且gcc或clang不会发出警告:

#include <iostream>

struct Base {
    virtual ~Base() = default;
    virtual std::string const& get() = 0;
};

struct Derived: Base {
    virtual std::string& get() override { return m; }
    std::string m;
};

int main()
{
    Derived d;
    d.get() = "Hello, World";

    Base& b = d;
    std::cout << b.get() << "\n";
}

std::string& covariant与std::string const&然后呢?

这是在class.virtual中指定的,在我们看到的最新草案(n4606)中:

§10.37 /重写函数的返回类型应与被覆函数的返回类型相同,或者与函数类的协变相同。 如果函数D::f覆盖函数B::f ,则函数的返回类型如果满足以下条件则是协变的:

  • 两者都是类的指针,都是对类的左值引用,或者两者都是对类111的右值引用
  • 在返回类型的类B::f是相同的类中的返回类型的类D::f ,或者是一个明确的和可访问的直接或间接的基类中的返回类型的类的D::f
  • 指针或引用具有相同的cv限定,并且返回类型D::f中的类类型具有与B::f的返回类型中的类类型相同的cv-qualification或更少的cv-qualification。

具体来说,最后一点完全解决了这里的情况:重写类型可以接受丢失const和/或volatile限定符(但不能获得它们)。


注意:正如@george上面提到的,第8段/用于防止这种情况与不完整的类类型一起使用,但这是固定的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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