按值获取对象的函数是否必须使用-fno-elide-constructors标志创建临时对象

时间:2018-01-10 10:47:54

标签: c++ copy-constructor move-constructor


我在更改c ++ 17到11之后编辑了这个问题

#include <cstdio>
#include <iostream>
#include <initializer_list>

using namespace std;
class A 
{
    public: 
    static int s;
    int t = s;
    A(){
      cout << "constructed"  << t<< endl;  
      s++;
    } 
 A (A&& a) {

    cout << "in move ctor, moving"<< a.t << " creating" << s << endl; 
     s++;
 }
 ~A() { 

     cout << "deleting"<< t << endl;
    }

};

A f1 (A a) 
{ 
    std::cout << "f1: " << endl; 
    return a; 
}
int A::s = 0;

int main() {
    f1(A()) ;
    std::cout <<  "is still alive!" << endl; 
}

汇编为g++ -std=c++11 -fno-elide-constructors -Wall -pedantic -pthread main.cpp && ./a.out
输出是:

constructed0
in move ctor, moving0 creating1
f1: 
in move ctor, moving1 creating2
deleting2
deleting1
deleting0
is still alive!

我无法理解为什么。

如果f1按值接收A,并且正在给出A&amp;&amp; object(来自f2),
它在f1函数里面创建一个临时对象“a”对吗? 如果是这样,当退出临时对象(此处为“1”)时应该已经被销毁,没有?从我从示例中可以看出,临时对象在行尾被销毁,所有其他临时对象,而不是f1内部的功能

所以问题是:
为函数创建的对象是否在函数内部(最后)被销毁?或者它在创建它的行的末尾被销毁。
非常感谢

0 个答案:

没有答案