我需要使用 ref With make_pair to Return 作为参考吗?

Do I Need to use ref With make_pair to Return a Reference?

给定这样一个对象:

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

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

的引用

此行为似乎与我在 gcc 8 中看到的一致:http://ideone.com/adz17e But when I try to run this on 它出现段错误。如果我更改为 return make_pair(true, ref(_mem)) 它会起作用,但我认为我不需要这样做。这些行为中哪一个是正确的?

这是未定义的行为。

因为 c++11 make_pair 定义为:

template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );

在你的例子中 _mem 是左值,所以 T2 被推导为 string&,但是结果对的 V2 是从 std::decay(string&) 推导出来的。 std::decay 总是丢弃引用。返回的对在 second 成员中有悬空引用。

Am I actually returning a reference to _mem or not?

不,你不是。 make_pair(true, _mem) 是一个 std::pair<bool, std::string>,它是您的会员的副本。然后将其转换为 return 类型的 std::pair<bool, std::string const&>,这意味着您正在 return 引用对立即销毁的临时文件。无条件悬挂。

回想一下,C++ 是一种值语义语言。默认情况下没有引用,你必须明确这一点。

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

return std::make_pair(true, std::ref(_mem));

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

或者,您可以直接明确:

return std::pair<bool, std::string const&>(true, _mem);

你可以把它写得更短:

return {true, _mem};