去年分析过一个右值导致变量生存期变长的日志,当时认为是对象生存期变长了,今天发现并不是如此,当时的小程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
auto transform(std::string && a)
{
  		std::cout << &a << std::endl;
  	 	return std::ref(a);
}
int main() 
{

 	auto a = transform("hahaha");
   	std::string &r = a.get();
   	std::cout << &r << std::endl;
  	r[0] = 'b';
    std::cout << r << std::endl;
}

当时用的是一个临时的string对象hahaa,今天用了个更简单的对象:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <string>
#include <functional>

struct B {

    //default ctor
    B() {
        std::cout << "B default " <<std::endl;
    }
    //copy ctor
    B(const B&) {
        std::cout << "B copy " <<std::endl;
    }

    B& operator=(const B&) {
        std::cout <<"B assign "<< std::endl;
        return *this;
    }

    B(B &&) {puts("B(B&&)");}
    B& operator=(B &&) {
        std::cout <<"B move " << std::endl;
        return *this;
    }

    ~B() { puts("~B()");}
};



auto transform(B && a)
{
    std::cout << &a << std::endl;
    return std::ref(a);
}
int main()
{
    auto a = transform(B());
    B &r = a.get();
    std::cout << &r << std::endl;
}

结果发现,确实在transform函数调用完之后,B()就析构了。

之前看到的程序没有core掉,有可能是那段内存并没有被回收而已。