我正在尝试学习C ++中的资源管理,在我的研究中,我遇到了一个有趣的优化。基本上,当使用复制构造函数初始化堆栈上的对象时,该对象是一个右值对象(是右值吗?),而不是调用该构造函数然后调用move构造函数,编译器只是调用原始Object的构造函数。
Object c(Object(1)); // This is the same as Object c(1);
Object c(Object(Object(Object(Object(Object(1)))))); // This is also the same as Object c(1);
Expected flow:
1. Object(1) calls the constructor and creates a nameless Object that will be removed as soon as it's created.
2. c notices this is an rvalue, and calls the move constructor.
3. Destructor for Object(1) is called.
Actual flow:
1. c(1) is called.
这很聪明,但是。如何?这招背后的机制是什么?即使Object的构造函数接受指针和许多参数,此方法也有效。
在C ++ 17之前,此行为属于copy elision。 Object(x)
指定创建一个临时对象,但是在某些情况下,编译器可以自行决定忽略创建和销毁所有临时对象。