C++返回类型,当我不知道它是否是临时的

Ala*_*ing 12 c++ virtual const reference return-value

假设这Foo是一个相当大的数据结构.如果我不知道继承的类是否将存储内部const实例Foo,我应该如何编写一个返回实例的虚函数Foo; 因此,允许通过引用返回.如果我不能在内部存储它,我的理解是我不能返回const它的引用,因为它将是一个临时的.它是否正确?这两个选项是:

virtual Foo foo() const { ... }
virtual Foo const & foo() const { ... }
Run Code Online (Sandbox Code Playgroud)

这是一个相关的问题,但从不同的角度来看.

Ste*_*sop 9

作为优化问题,您只对值返回和const引用返回之间的区别感兴趣,但事实并非如此.每次返回一个不同的值与每次返回一个引用之间有一个根本不同的含义,很可能是同一个对象,很可能会被修改:

const Foo &a = myobj.foo();
myobj.modify_the_foo();
const Foo &b = myobj.foo();
a == b; // do you want this to be true or false?
Run Code Online (Sandbox Code Playgroud)

调用者需要知道它是什么,因为程序员需要知道其含义,并且因为编译器需要知道调用约定,所以不能将它们混合在同一虚函数的不同覆盖中.如果某些派生类想要做一个,有些想要做另一个,那么这是运气不好,他们不能,不止一个可以返回一个int和另一个float.

你也许可以回复一个shared_ptr.这样,"想要"返回引用的派生类可以创建一个shared_ptr不执行任何操作的删除操作(但要小心 - shared_ptr如果原始对象被销毁,那将会悬挂,并且这不是您通常所期望的返回shared_ptr.所以如果它是有意义的,因为Foo它比它来自的对象更长,然后它会更好地动态分配它,通过a保持它shared_ptr,并返回它的副本,而不是一个无用的删除器)."想要"返回值的派生类每次都可以分配一个新的类.由于Foo"相当大",希望shared_ptr动态分配的成本与创建新值返回时所做的相比并不太痛苦.

另一种可能性是Foo变成一个引用相当大的数据结构的小型pImpl风格的类.如果涉及的所有内容都是不可变的,那么"想要返回引用"的情况可以共享多个Foo实例之间的大数据结构.即使不是,你也可以考虑写时复制.