当 C++(隐式或显式)值构造函数需要以任何一种方式在其对象中存储参数的副本时,是否应该通过值或引用到常量来接受其参数?
这是我能想到的最短的例子:
struct foo {
bar _b;
foo(bar [const&] b) // pass by value or reference-to-const?
: _b(b) { }
};
这里的想法是,我想在创建 foo 对象时以任何可能创建 foo 对象的各种方式来最小化对 bar 的复制构造函数的调用。
请注意,我确实对复制省略和(命名的)返回值优化有所了解,并且我已经阅读了“想要速度?按值传递”,但是我认为这篇文章没有直接解决这个用例。
编辑:我应该更具体。
假设我不知道sizeof(bar)
,或者是否bar
是基本的内置类型(bar
可能是模板参数,并且foo
可能是类模板而不是类)。此外,不要假设foo
' 构造函数可以内联(或bar
' ,就此而言)。请假设我至少可能正在使用实现 RVO 的编译器。
我想要的是有可能(给定编译器优化)这样的调用不会调用任何对bar
' 的复制构造函数的调用(即使_b(b)
在foo
' 的初始化列表中执行时):
foo f = function_that_creates_and_returns_a_bar_object_using_rvo();
foo
是否有可能(给定 C++98 标准)可以做到这一点,如果是这样,如果通过对 const 的引用而不是通过值接受其参数,它或多或少可能会起作用?