我的代码中有如下情况:
#include <memory>
struct X
{
int i;
};
std::shared_ptr<const X> getProtoX();
void modifyX(X&);
void consumeX(const X&);
void suboptimal(bool condition)
{
std::shared_ptr<const X> x = getProtoX();
X copy(*x);
if (condition)
modifyX(copy);
consumeX(copy);
}
请注意 getProtoX()
返回一个指向常量的指针!
我们得到一个 const
来自某处的对象,并希望不加修改地传递它或传递修改后的拷贝。 consumeX
不关心它收到的是原始拷贝还是修改后的拷贝,只关心包含的值是它应该的值。上面的代码总是复制一个 X
, 即使condition
是假的,不需要复制。
我想在 condition == false
时避免这种不必要的复制,但我能想到的任何方法都不能取悦我:https://godbolt.org/z/YGLVxT
看看,如果getProtoX()
返回了 std::shared_ptr<X>
,任务会很简单:
std::shared_ptr<X> x = getProtoX();
if (condition)
{
x = std::make_shared<X>(*x);
modifyX(*x);
}
consumeX(*x);
这是我想在代码中表达的控制流。但是一旦我们添加了常量正确性,我们就会产生开销或者由于混合的原因而不得不完全模糊意图const
、范围和生命周期管理约束。
我觉得应该有一种干净的方法可以在 const-correct 的情况下执行此操作,而无需像立即调用 lambdas 这样的语法杂技或将操作移动到一个单独的函数中,但我找不到它。请注意,应该只有一个 consumeX
调用并且它应该停留在函数范围内(在示例代码中对此进行编码会造成一些困惑并提示更多解决方法,这不是我在这里关心的)。
最佳答案
std::shared_ptr<const X> x = getProtoX();
if (condition)
{
std::shared_ptr<X> y = std::make_shared<X>(*x);
modifyX(*y);
x = std::move(y);
}
consumeX(*x);
关于c++ - 有条件地传递修改后的拷贝而不是 const original 变得丑陋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57275913/