c++ 临时变量作为const T& 返回值,被接收后为什么会被析构?

新手上路,请多包涵
#include <iostream>

struct A {
    int v;
    A(int x = 0):v(x) {
        std::cout << "构造函数:" << this << std::endl;
    }
    A(const A& a) {
        std::cout << "拷贝构造函数:" << this << " " << &a << std::endl;
        this->v = a.v;
    }
    A& operator=(const A& a) {
        std::cout << "拷贝运算符:" << this << " " << &a << std::endl;
        this->v = a.v;
        return *this;
    }
    ~A() {
        std::cout << "析构函数:" << this << std::endl;
    }
};

const A& func() {
    return A(3);
}
int main() {
    const A& a = func();
    std::cout << a.v << std::endl;
    std::cout << a.v << std::endl;
}

而且析构后的a的值访问两次结果不一样,这中间发生了什么

阅读 3.4k
3 个回答
const A& func() {
    return A(3);
}

A(3) 是临时变量,不能返回临时变量得引用。这是一个未定义行为,意味着什么都可能发生(比如值会莫名奇妙地改变)。


可以改成 A func() { ,直接返回临时变量(的拷贝)。

补充一下 @fefe 的回答,这里看似是一定要做一次复制,但函数返回值优化(RVO)是 C++ 一直在改进的内容。如 C++17

推荐问题