假设您有一个 C++ 函数,它使用 (const) 参数的更改版本。
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
MyObject const & altered( alter_obj( original ) );
// ...
}
由于“最重要的常量”而导致临时的生命周期延长,因此这种方法可以正常工作。如果alter_obj()
满足返回值优化的要求,因为 RVO 意味着不会不必要地复制按值返回的更改对象。
如果您根本不进行更改,它也会很有效:
void func( MyObject const & original ) {
MyObject const & not_altered( original );
// ...
}
对给定对象的附加引用基本上是免费的,没有任何复制的性能开销。
但是假设需求发生了一些变化,并且您希望根据运行时条件选择是否进行更改。天真地,我希望使用三元运算符来组合前面的两种方法会很有效,在可能的情况下直接绑定原始对象,如果没有则绑定临时对象。
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
// ...
MyObject const & possibly_altered(
apply_alteration ?
alter_obj( original ) :
original
);
// ...
}
然而,这种方法似乎并不像我希望的那样有效。三元运算符显然需要最后两个参数左值/右值状态匹配 https://stackoverflow.com/a/30088030/3022952,而不仅仅是名义类型。这意味着当采用 false(无更改)分支时,通过调用 MyObject 的复制构造函数来创建临时右值original
。如果 MyObject 的复制难度很大,则由于制作此“虚假”副本,可能会造成性能损失。
有没有好的办法解决这个问题?是否可以有效地将本地引用绑定到另一个现有引用或临时引用(基于运行时值的选择),而无需制作额外的副本?