我需要使用 ref 和 make_pair 来返回引用吗?

Jon*_*Mee 5 c++ reference std-pair c++14 visual-studio-2017

给定一个这样的对象:

struct Foo {
    string _mem;
    pair<bool, const string&> Func() { return make_pair(true, _mem); }
};
Run Code Online (Sandbox Code Playgroud)

我实际上是否返回了对的引用_mem?我的理解是,在 make_pair会转发我的类型,允许我用来捕获它作为对对象的_mem.

这种行为似乎与我在 gcc 8 中看到的一致:http : //ideone.com/adz17e但是当我尝试在上运行它时,它会出现段错误。如果我更改返回make_pair(true, ref(_mem))它有效,但我认为我不需要。这些行为中哪一种是正确的?

Bar*_*rry 5

我实际上是否返回了对的引用_mem

不,你不是。make_pair(true, _mem)std::pair<bool, std::string>您的成员的副本。然后std::pair<bool, std::string const&>在返回类型中将其转换为 a ,这意味着您正在返回对立即销毁的临时对象的引用。无条件悬空。

回想一下,C++ 是一种值语义语言。默认情况下没有任何参考,您必须明确说明这一点。

你有两种方法可以做到这一点。您可以标记您想要参考:

return std::make_pair(true, std::ref(_mem));
Run Code Online (Sandbox Code Playgroud)

make_pair将解开std::reference_wrappers,所以这个表达式是一个std::pair<bool, std::string&>.

或者,您可以明确表示:

return std::pair<bool, std::string const&>(true, _mem);
Run Code Online (Sandbox Code Playgroud)

你可以写得更短:

return {true, _mem};
Run Code Online (Sandbox Code Playgroud)