【问题标题】:std::tie for C++17 struct operator<?用于 C++17 结构运算符的 std::tie<?
【发布时间】:2021-01-30 10:53:33
【问题描述】:

考虑以下 C++17 结构:

struct S {
   M1 m1; M2 m2; M3 m3;

   bool operator<(const S& that) const { return tie() < that.tie(); }

   auto tie() const { return std::tie(m1,m2,m3); }
};

这是正确的吗? S::tie 会返回一个对成员的引用元组,还是会复制一份?会自动推断出正确的类型(引用元组)吗? constness 做对了吗?

(我看到的示例对 std::tie 进行了两次调用,并且没有像这样将其分解为单独的成员函数。想知道/怀疑是否有原因。)

【问题讨论】:

  • std::tie 返回 "...一个包含左值引用的 std::tuple 对象..." en.cppreference.com/w/cpp/utility/tuple/tie
  • @RichardCritten:是的,但是如果您进一步向下看该页面,他们会在operator&lt; 的示例中调用它两次。它会像我在成员函数中所做的那样工作吗?我想我只是对他们在示例中没有这样做的事实感到奇怪。
  • 成员函数更好 - 参见 DRY 规则。所以你的版本更好,更不容易出错

标签: c++ c++17


【解决方案1】:

这是正确的吗?

是的,尽管这可能取决于您打算做什么。

S::tie 会返回一个对成员的引用元组

是的。

还是要复印一份?

没有。这很容易通过使用不可复制的类型来验证。

会自动推断出正确的类型(引用元组)吗?

是的。


随着默认比较运算符的引入,这在 C++20 中将不再必要也不再有用。

【讨论】:

  • 领带技术不仅可以用于比较运算符。
猜你喜欢
  • 1970-01-01
  • 2020-01-25
  • 2011-01-11
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2014-07-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多