首页 > 解决方案 > std::tie 和 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(). 有区别吗?我应该更喜欢哪个?

标签: c++c++14

解决方案


让我们看看签名。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;解包 a pair),而std::forward_as_tuple()主要是为了在函数中传递东西以避免复制。但它们都可以用来解决这个问题。tie显然要短得多,并且可以说更知名(tie使用它来实现的 cppreference 示例operator<),所以这会得到我的投票。


推荐阅读