gpt4 book ai didi

c++ - 为什么在将右值按值传递给函数时不调用复制构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:32 26 4
gpt4 key购买 nike

这是我不知何故错过的一件事,但我很惊讶。考虑以下代码示例:

#include <iostream>

class A
{
int a;

public:
A(int a) : a(a) { std::cout << "Normal constructor called." << std::endl; }
A(const A& orig) : a(orig.a) { std::cout << "Copy constructor called." << std::endl; }
};

void testFunction1(const A arg) { std::cout << "testFunction1()" << std::endl; }
void testFunction2(const A& arg) { std::cout << "testFunction2()" << std::endl; }

int main()
{
testFunction1(A(2));

testFunction2(A(2));

return 0;
}

我期望得到以下结果:

/* Normal constructor called. */
/* Copy constructor called. */
/* testFunction1() */
/* Normal constructor called. */
/* testFunction2() */

但是我错了。确切的结果如下:

/* Normal constructor called. */
/* testFunction1() */
/* Normal constructor called. */
/* testFunction2() */

当我将 A(2) 按值传递给 testFunction1() 时,为什么没有调用复制构造函数?这是否意味着在 C++98 中按值或引用传递右值没有区别?是优化吗? A(2)arg 完全相同 testFunction1() 中的对象吗?

最佳答案

Is it an optimization?

是的!它叫做 Copy Elision ,如果可能,可以省略(绕过)拷贝,具体取决于编译器。

所以在你的情况下,编译器知道它可以在不调用复制构造函数的情况下逃脱,并且正是这样做的。请注意,即使您使用了 arg,例如调用 A 的打印成员函数,编译器仍然可以使用复制省略来进行优化。换句话说,不使用 arg 不是此行为的原因。

如果您使用一个古老的编译器,或者调整当前编译器的设置,您可能会在第一时间看到您预期的结果。

, 正如 Guillaume Racicot 提到的那样,在这种情况下可以保证复制省略。

关于c++ - 为什么在将右值按值传递给函数时不调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649953/

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