给定这样一个对象:
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 上运行时,它会出现段错误。如果我更改为返回 make_pair(true, ref(_mem))
,它就可以工作了,但我并不认为需要这样做。这些行为中哪一个是正确的?
make_pair(true, ref(_mem))
,这似乎有效。那样也会衰减到只返回类型吗? - Jonathan Meereference_wrapper<string>
上使用decay
可以得到string&
。你不需要使用ref
,只需在模板参数列表中显式地放置类型:pair<bool,const string&>(true,_mem)
。这个make_tuple(true,_mem)
和pair<bool,string>(true,_mem)
是一样的,所以_mem
被复制到本地作用域中,这就是为什么你会得到悬空引用。 - rafix07