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

标签 c++ reference visual-studio-2017 c++14 std-pair

给定这样一个对象:

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

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

此行为似乎与我在 gcc 8 中看到的一致:http://ideone.com/adz17e但是当我尝试在 上运行它时它是段错误。如果我更改为 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/

相关文章:

java - JNI 检测到应用程序错误 : use of deleted local reference 0x1

c++ - 为什么装饰模式适用于指针而不适用于引用?

Java反射改变参数?

c# - 升级 .NET 版本后,TwoWay 或 OneWayToSource 绑定(bind)无法对只读属性起作用

c# - 对于 .Net Native C# 应用程序,无法通过 WACK 测试并避免 ILT005 错误

c++ - 更改相机位置会导致某些顶点的颜色消失

c++ - const TYPE& - 什么时候我想通过引用使用 const?

c++ - 在对的 vector 中按关键字查找对

C#引用成员变量

entity-framework - Visual Studio 2017 for ASP.NET Core 中是否有不需要包管理器控制台的 Entity Framework 数据库上下文生成器?