gpt4 book ai didi

c++ - 为什么将对象传递给函数时不调用复制构造函数

转载 作者:太空狗 更新时间:2023-10-29 21:19:43 24 4
gpt4 key购买 nike

<分区>

我有以下代码:

#include <iostream>
using namespace std;

class foo
{
public:
foo(int a, int b) :
a_(a), b_(b)
{ cout << "regular const" << endl; }

foo(const foo& f) :
a_(f.a_), b_(f.b_)
{ cout << "copy const" << endl; }

foo& operator=(const foo& rhs)
{cout << "copy= const" << endl; a_ = rhs.a_; b_ = rhs.b_; return *this; }

int a_, b_;
};

void bar(foo f)
{ }

int main()
{
foo f1(10, 20);
cout << "------" << endl;

bar(f1);
cout << "------" << endl;

bar(foo(11, 22)); // line 29
cout << "------" << endl;

bar({13, 23}); // line 32
cout << "------" << endl;

}

我得到以下输出:

$ ./a.out
regular const
------
copy const
------
regular const
------
regular const
------

对于第 29 行和第 32 行,我期望在 main 中创建一个临时对象(调用常规构造函数),然后在传递给 bar() 时调用一个复制构造函数。从输出中我看到编译器做了一些优化,并且猜测可能只是在调用 bar() 时在堆栈上创建对象并且只调用常规构造函数。谁能帮我了解正在进行的优化类型或幕后发生的事情。

就生成的代码而言,使用第 29 行和第 32 行调用 bar() 是否等效?我知道第 29 行更具可读性。

我改变了 bar() 如下:

 void bar(const foo& f)
{ }

我在第 29 行和第 32 行得到相同的输出。在这种情况下,对象在哪里创建?

谢谢,艾哈迈德。

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