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?我的理解是,在c++14 中 make_pair会转发我的类型,允许我用来捕获它作为对对象的_mem.
这种行为似乎与我在 gcc 8 中看到的一致:http : //ideone.com/adz17e但是当我尝试在visual-studio-2017上运行它时,它会出现段错误。如果我更改返回make_pair(true, ref(_mem))它有效,但我认为我不需要。这些行为中哪一种是正确的?
我实际上是否返回了对的引用
_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)
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |