提问人:Alexey Starinsky 提问时间:8/23/2018 最后编辑:BarryAlexey Starinsky 更新时间:1/3/2021 访问量:2572
std::tie 和 std::forward_as_tuple 有什么区别
What is the difference between std::tie and std::forward_as_tuple
问:
对于给定的类,如果我想编写所有比较运算符,为了避免代码重复,我会编写如下内容:
class B {
public:
bool operator==(Type const& rhs) const {
return as_tuple() == rhs.as_tuple();
}
bool operator!=(Type const& rhs) const {
return as_tuple() != rhs.as_tuple();
}
// .. and same for other operators ..
private:
auto as_tuple() const {
return std::tie(a, b, c); // all the members
}
};
我可以在那里实现,或者我可以用 .有区别吗?我应该更喜欢哪个?as_tuple()
std::tie()
std::forward_as_tuple()
答:
10赞
Barry
8/23/2018
#1
让我们只看签名。std::tie()
为:
template< class... Types > constexpr tuple<Types&...> tie( Types&... args ) noexcept;
template< class... Types > constexpr tuple<Types&&...> forward_as_tuple( Types&&... args ) noexcept;
唯一的区别是前者只接受左值,而后者接受左值和右值。如果所有输入都是左值值,就像它们在用例中一样,那么它们是完全等效的。
std::tie()
主要用作作业的左侧(例如 解压缩一个),而主要是为了在函数中传递东西以避免复制。但它们都可以用来解决这个问题。 显然要短得多,而且可以说更广为人知(使用它来实现的 cppreference 示例),所以这将得到我的投票。std::tie(a, b) = foo;
pair
std::forward_as_tuple()
tie
tie
operator<
评论
1赞
Barry
8/23/2018
@Slava 我们做的是,这些是成员名称,即左值。tie(a, b, c)
4赞
Barry
8/23/2018
@Slava 它仍然是一个价值......只是.这些概念是正交的。const
5赞
Cubbi
8/23/2018
@Slava lvalue 在 1970 年代的某个地方不再意味着“分配的左边”,当它进入 C 时
1赞
Slava
8/23/2018
@Cubbi他们应该同时停止使用术语“lvalue”。
4赞
Yakk - Adam Nevraumont
8/23/2018
@slava将它们视为 Lovely 值和 pirrrrate 值(如果有帮助)。
3赞
Prashant Nidgunde
1/3/2021
#2
这是一篇关于同一主题的好文章。
从链接中的文章:
总之,当您需要构建元组时,请使用:
std::make_tuple
如果需要返回的元组中的值,std::tie
如果需要在返回的元组中引用左值,std::forward_as_tuple
如果需要保留输入的引用类型以构建元组。
评论
tie
forward_as_tuple