如果我这样编写代码:
shared_ptr<Foo> Bar::getFoo()
{
return m_foo;
}
void somewhereElse()
{
shared_ptr<Foo> foo = myBar.getFoo();
//do some stuff with foo
}
编译器可以以某种方式优化代码,以便将其更改为:
void somewhereElse()
{
const shared_ptr<Foo> &foo = myBar.getFoo__by_ref_somehow();
//do some stuff with foo
}
我问,因为在并发执行的情况下这可能是一个问题。
据我所知,可以应用RVO并删除额外的副本,但编译器是否可以删除副本?
答案 0 :(得分:3)
没有。您要求输入值,因此获取值。复制省略是为了避免不必要的副本。你想要一个价值;该函数返回一个值。所以你将获得至少一份副本。您想要的是某种形式的代码转换,将值转换为参考。
您可以创建函数getFoo__by_ref_somehow
,它会将const&
返回给存储在类中的值。但这将是您创建的不同功能,而不是允许编译器为您创建的功能。