首页 > 解决方案 > 在调用函数中可以访问对字符串文字的返回引用(作为参数传递),但是,存储引用的返回对象为空

问题描述

我将一个字符串文字传递给一个函数,该函数只返回一个对它的 const 引用。在调用函数中,字符串是可访问和打印的。

但是,在另一个函数中,我正在实例化一个包含对字符串文字的 const 引用的类。返回此对象不会在调用函数中打印任何内容。

环境:Visual Studio 2017 (/std:c++=17)

这似乎不寻常。有什么线索吗?

class Test {
private:
    const string& str_;

public:
    Test(const string& str)
        : str_{str}
    {}

    Test(const Test&) = delete;
    Test& operator=(const Test&) = delete;

    friend ostream& operator<<(ostream& out, const Test& t) {
        return (out << t.str_);
    }
};

const Test& returnString2(const string& str) {        
    return Test{ str };
}

const string& returnString1(const string& str) {
    return str;
}

void testRef() {
    cout << "testRef: " << returnString2("Roofus") << "\n";
}

标签: c++

解决方案


在:

const Test& returnString2(const string& str) {        
    return Test{ str };
}

您正在创建一个临时Test的,您正在返回一个引用。但是这个临时的在函数结束时被销毁,导致未定义的行为。这与传入的 ref 无关- 它是已被销毁str的临时对象。Test对的引用str仍然愉快地退出。

在:

const string& returnString1(const string& str) {
    return str;
}

您只是返回传入的 ref - 当函数返回时它仍然存在,所以cout << "testRef: " << returnString2("Roofus") << "\n";很好。

事实上,一个好的编译器会警告你(不确定 Visual Studio 做了什么——但我相信你可以打开这样的警告):https ://godbolt.org/z/E4s46bdEP


推荐阅读