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

时间:2018-08-22 16:09:59

标签: c++ c++14

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

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()处实现。有区别吗?我该选哪个?

2 个答案:

答案 0 :(得分:7)

让我们看一下签名。 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()主要用于分配的左侧(例如,std::tie(a, b) = foo;用于解包pair),而std::forward_as_tuple()主要用于传递内容避免复制的功能。但是它们都可以用来解决这个问题。 tie显然要短得多,并且可以说是众所周知的(tie的cppreference示例使用它来实现operator<),这样我就可以投票。

答案 1 :(得分:0)

Here 是一篇关于同一主题的好帖子。

来自链接中的文章:

总而言之,当你需要构建一个元组时,使用:

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