gpt4 book ai didi

c++ - 将新创建的对象传递给函数时是否可以避免复制构造函数?

转载 作者:行者123 更新时间:2023-11-30 02:42:11 26 4
gpt4 key购买 nike

我想知道在将刚刚创建的对象传递给函数时是否可以避免调用复制构造函数?我不想再使用这个对象,我只想命名临时对象并将其按值传递给其他函数。

我知道在 C++11 中我只能移动这个对象,但我担心如何在 C++03 中改进它。所以基本上,我有兴趣消除下面代码中的复制构造函数调用:

片段:

#include <iostream>

struct Foo
{
Foo(void) { std::cout << "Default ctr\n"; };
Foo(const Foo& f) { std::cout << "Copy ctr\n"; }
};

void bar(Foo f)
{
std::cout << "Inside bar\n";
}

int main()
{
Foo f;
bar(f);
bar(Foo());
}

可能的结果:

Default ctr
Copy ctr
Inside bar
Default ctr
Inside bar

编译字符串:

g++ -O3 -Wall -pedantic main.cpp && ./a.out

即使用某种复制省略,但在传递给函数的参数上,而不是在返回值 (NRVO) 上。

最佳答案

按值传递意味着复制。这种复制可以被省略,但按值语义传递仍然是复制。您也可以通过引用传递以避免此拷贝。请注意,这些是唯一允许复制省略的情况:

  • 在返回声明中
  • 在抛出表达式中
  • 使用未绑定(bind)到引用的临时对象
  • 还有一个是处理异常

这就是为什么在:

bar(f);
bar(Foo());

只有第二个涉及复制省略。在 C++11 之前,只需使用引用或使用 Boost。

关于c++ - 将新创建的对象传递给函数时是否可以避免复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27344473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com