std::tie 和 std::forward_as_tuple 有什么区别

What is the difference between std::tie and std::forward_as_tuple

提问人:Alexey Starinsky 提问时间:8/23/2018 最后编辑:BarryAlexey Starinsky 更新时间:1/3/2021 访问量:2572

问:

对于给定的类,如果我想编写所有比较运算符,为了避免代码重复,我会编写如下内容:

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()

++ 的 C++14

评论

1赞 Barry 8/23/2018
您是否在问重构通用代码是否更好,以便您可以只调用一个函数,而不是在多个位置复制相同的代码?是的。
0赞 Alexey Starinsky 8/23/2018
@Barry 可能我在问 std::tie 和 std::forward_as_tuple 之间的区别。
4赞 Barry 8/23/2018
“可能”是什么意思?如果问题是“和之间有什么区别?”你能把它变成问题吗?tieforward_as_tuple
0赞 Alexey Starinsky 8/23/2018
@Barry 更确切地说,我不太明白 std::forward_as_tuple 是什么。目前我的想法是我应该更好地使用 std::tie 实现 as_tuple(),至少它工作正常。
0赞 Barry 8/23/2018
对你的问题的重写是否与你想弄清楚的内容相符?

答:

10赞 Barry 8/23/2018 #1

让我们只看签名。std::tie() 为:

template< class... Types >
constexpr tuple<Types&...> tie( Types&... args ) noexcept;

std::forward_as_tuple() 是:

template< class... Types >
constexpr tuple<Types&&...> forward_as_tuple( Types&&... args ) noexcept;

唯一的区别是前者只接受左值,而后者接受左值和右值。如果所有输入都是左值值,就像它们在用例中一样,那么它们是完全等效的。

std::tie()主要用作作业的左侧(例如 解压缩一个),而主要是为了在函数中传递东西以避免复制。但它们都可以用来解决这个问题。 显然要短得多,而且可以说更广为人知(使用它来实现的 cppreference 示例),所以这将得到我的投票。std::tie(a, b) = foo;pairstd::forward_as_tuple()tietieoperator<

评论

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

这是一篇关于同一主题的好文章。

从链接中的文章:

总之,当您需要构建元组时,请使用:

  1. std::make_tuple如果需要返回的元组中的值,
  2. std::tie如果需要在返回的元组中引用左值,
  3. std::forward_as_tuple如果需要保留输入的引用类型以构建元组。