从纯虚函数返回引用是否可以?

时间:2011-06-24 08:47:37

标签: c++ interface reference virtual-functions

class I {
public:
  virtual std::wstring const& GetName() const = 0;
};

通常,实现此接口的客户端在其正文中包含其名称。一切正常。但有时候,'GetName'的结果是在函数执行期间计算的。使用静态变量来存储结果不是一个好主意。但按值返回需要额外的性能开销。

那么这个问题怎么解决?感谢。

5 个答案:

答案 0 :(得分:4)

  

但按价值回归需要   额外的性能开销。

事实并非如此。编译器通常可以使用Return Value Optimization来删除副本。

答案 1 :(得分:0)

不要猜测性能问题:虽然人们经常通过const引用返回std::string,但按值返回值并不是什么大问题,特别是如果你别无选择。

实际上,有时甚至可以更改后者,因为它只影响客户端代码的一些内容。

记住:过早优化是万恶之源。

现在,要完全回答这个问题,你可以在虚函数中完美地返回一个引用(无论它是纯粹的还是不真实的)。确保永远不要返回对临时的引用。

如果某些派生类需要执行代价高昂的计算,它仍然可以将结果存储在成员std::wstring中并返回对该成员的引用。但是再一次,不要猜测性能问题:首先测量并关注它,只有这似乎是瓶颈。

答案 2 :(得分:0)

确定在什么意义上?这是合法的C ++。通常编程很糟糕 练习,因为你提到:它强加了(通常)不必要的 对派生类的限制。你应该独立于virtual 只有当函数的语义需要它时才返回引用; 如果类型具有值语义,如std::string,则会这样 只是一个非const引用。 (模板在某种程度上使问题复杂化, 像std::vector这样的类返回a是合理的 从operator[] const引用const。)

答案 3 :(得分:0)

这似乎是一个坏主意。如果开销真的很重要,你可以使用一些带有隐式共享的字符串容器(写时复制语义),比如QString

答案 4 :(得分:0)

虽然其他人似乎都认为这是一个非常糟糕的主意(由于各种原因,所有这些都有些真实),但我没有看到任何从根本上错误返回{ {1}}。

这样做

  • 在技术上是合法的,并且可以正常工作(它只是规定了衍生类必须以某种未指明的方式实现的“契约”)
  • 可能是一个微不足道的微优化(在优化的构建中也可能与RVO没有什么不同),但它也不会伤害......就此而言,
  • 不允许调用者修改名称,这是有意义的(调用者没有能力这样做,这就是他首先要问的原因!) - 这在语义上实际上是一件好事
  • 无论实际的未知实现如何都会工作,即使对于临时工具也是如此(因为对于 const 引用,标准将局部变量的生命周期延长到引用的生命周期)

所以,虽然有点不寻常,但是如果它做了你想要的(特别是明确表示调用者可能不会修改字符串),我认为没有绝对的理由不这样做。