给定这样一个对象:
struct Foo {
string _mem;
pair<bool, const string&> Func() { return make_pair(true, _mem); }
};
我实际上是否返回了对 _mem
的引用?我的理解是在c++14 make_pair
将转发我的类型,允许我使用的返回来捕获它作为对对象的 _mem
的引用。
此行为似乎与我在 gcc 8 中看到的一致:http://ideone.com/adz17e但是当我尝试在 visual-studio-2017 上运行它时它是段错误。如果我更改为 return make_pair(true, ref(_mem))
它会起作用,但我认为我不需要这样做。这些行为中哪一个是正确的?
最佳答案
Am I actually returning a reference to
_mem
or not?
不,你不是。 make_pair(true, _mem)
是 std::pair<bool, std::string>
那是你的成员(member)的拷贝。然后将其转换为 std::pair<bool, std::string const&>
在返回类型中,这意味着您要返回对立即销毁的临时对象的引用。无条件悬挂。
回想一下,C++ 是一种值语义语言。默认情况下没有引用,您必须对此明确说明。
您有两种方法可以做到这一点。您可以标记您想要引用:
return std::make_pair(true, std::ref(_mem));
make_pair
将展开 std::reference_wrapper
s,所以这个表达式是一个 std::pair<bool, std::string&>
.
或者,您可以直接明确:
return std::pair<bool, std::string const&>(true, _mem);
你可以把它写得更短:
return {true, _mem};
关于c++ - 我需要使用 ref 和 make_pair 来返回引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57860088/