我需要使用 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
吗?我的理解是 c++14 make_pair
会转发我的类型,允许 return 我用来捕获它作为对对象 _mem
.
的引用
此行为似乎与我在 gcc 8 中看到的一致:http://ideone.com/adz17e But when I try to run this on visual-studio-2017 它出现段错误。如果我更改为 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_wrapper
s,所以这个表达式是 std::pair<bool, std::string&>
.
或者,您可以直接明确:
return std::pair<bool, std::string const&>(true, _mem);
你可以把它写得更短:
return {true, _mem};
给定这样一个对象:
struct Foo {
string _mem;
pair<bool, const string&> Func() { return make_pair(true, _mem); }
};
我实际上 return 引用了 _mem
吗?我的理解是 c++14 make_pair
会转发我的类型,允许 return 我用来捕获它作为对对象 _mem
.
此行为似乎与我在 gcc 8 中看到的一致:http://ideone.com/adz17e But when I try to run this on visual-studio-2017 它出现段错误。如果我更改为 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_wrapper
s,所以这个表达式是 std::pair<bool, std::string&>
.
或者,您可以直接明确:
return std::pair<bool, std::string const&>(true, _mem);
你可以把它写得更短:
return {true, _mem};