【发布时间】:2019-02-26 00:32:30
【问题描述】:
今天我遇到了一些我不太了解的关于复制构造函数的事情。
考虑下一个代码:
#include <iostream>
using namespace std;
class some_class {
public:
some_class() {
}
some_class(const some_class&) {
cout << "copy!" << endl;
}
some_class call() {
cout << "is called" << endl;
return *this; // <-- should call the copy constructor
}
};
some_class create() {
return some_class();
}
static some_class origin;
static some_class copy = origin; // <-- should call the copy constructor
int main(void)
{
return 0;
}
然后在将原点分配给副本时调用复制构造函数,这是有道理的。但是,如果我将副本声明更改为
static some_class copy = some_class();
它没有被调用。即使我使用create() 函数,它也不会调用复制构造函数。
但是,当将其更改为
static some_class copy = some_class().call();
它确实调用了复制构造函数。 一些研究解释说,允许编译器优化复制构造函数,这听起来是件好事。直到复制构造函数是非默认的,否则它可能会或可能不会做一些明显的事情,对吧? 那么什么时候允许编译器优化出拷贝构造函数呢?
【问题讨论】:
-
static some_class copy = some_class();- 它将调用默认构造函数 -
在问题中编写代码的提示:提供显示问题的代码。在这里,您提供了按您期望的方式工作的代码,然后您提供了有关如何修改它以显示问题的说明。那是倒退。方便人们复制和粘贴代码。
-
一个相关问题:stackoverflow.com/q/12953127/580083。另请注意,在
static some_class copy = origin;中,copy未分配给,它是复制构造的(这是两个不同的东西)。
标签: c++ language-lawyer copy-constructor copy-elision