19
下面的代码编译和运行,并且没有警告是由两种或GCC铛发出:我可以在覆盖虚拟函数的返回类型中丢失“const”吗?
#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&
协与std::string const&
呢?
是有意义的,因为如果需要,您可以简单地重新应用调用方的常量。当然,你不能自动退回,所以相反的情况不会是这样。 – xaxxon
@xaxxon:是的,我真的很惊讶它的工作原理(从来没有想过它!)......尤其是因为CLion不幸在那里发生了错误。为此,我在跟踪器上提出了一个错误。 –
有趣的是,我发现它在DR1250中也被固定以允许不完整的类型:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1250 – marcinj