在复制构造函数中创建临时对象
temporary object creation in copy constructor
我正在阅读c++中的复制构造函数
前面提到,使用按值调用和按值返回的方法传递对象,构造了一个用户永远不会看到的临时对象。我的理解是当我们调用val时例如
myclass b;
void myfunc(myclass c) {} //c(b) copy constructor is called.
创建临时对象的位置?
谢谢!
在myfunc()
的作用域中创建副本。也就是说,c
在整个函数的范围内,它包括(并且略大于)函数体。当函数返回时,即在myfunc(b);
的分号处,副本被销毁。
在按值传递的情况下,将复制作为参数(而不是临时参数),因此在示例中的特定代码中,将有两个对象:
myclass b;
myfunc( b ); // b is copied to argument "c" by means of the copy constructor
在按值返回的情况下,事情有点复杂,在代码中:
type f() {
type tmp;
return tmp; // copies into temporary (again, copy constructor)
}
int main() {
type x = f(); // copies from temporary into x (copy constructor)
x = f(); // copies from temporary into x (assignment operator)
}
理论上有3个类型为type
的对象。在调用f
之前,编译器将在调用约定定义的位置为type
对象创建空间(这将是创建临时对象的位置),然后调用该函数并在f
中创建tmp
,它在返回语句中被复制到临时对象中。最后,将临时文件复制到main
的x
变量中。
更详细的描述可以阅读:
- http://definedbehavior.blogspot.com/2011/08/value-semantics-nrvo.html
- http://definedbehavior.blogspot.com/2011/08/value-semantics-copy-elision.html
相关文章:
- 为什么当我们有常量引用时创建临时对象?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 我试图创建临时对象的方式有错误吗
- 将项添加到矢量而不创建临时对象
- 在此初始化中创建的临时对象数
- 在没有返回值优化的情况下将两个对象加在一起时,将创建多少个临时对象
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 按值函数创建范围的临时对象
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- 是否在对象中创建临时接口
- Visual Studio 在类型转换时不会创建临时对象
- 通过引用捕获异常时未创建临时对象
- 返回临时对象是否会在C++中创建临时对象
- 在引用初始化期间如何创建临时对象
- 创建c++临时对象
- 我可以直接调用operator()而不创建临时对象吗?
- 在复制构造函数中创建临时对象
- c++优先级队列推送/模板,而不创建临时对象
- 构造函数 c++ Object obj = Object( "string" , 22);正在创建临时对象?