【问题标题】:Requirements for std::ignorestd::ignore 的要求
【发布时间】:2013-05-19 06:46:56
【问题描述】:

C++11 引入了一个名为std::ignore的对象:

const /* unspecified */ ignore;

为了简洁,让

typedef decltype(std::ignore) T; 

据我所知,由于std::tie [C++11, 20.4.2.4:7] 的规范,T 的唯一要求是它是CopyAssignable

在 g++-4.8 中,我发现 T 也是 DefaultConstructible(例如,T x; 编译)。这是实现定义的行为吗?

(如果我对T还有其他要求我遗漏了,请详述。)

【问题讨论】:

  • 这是一个有趣的问题。其背后的动机是什么?似乎很清楚 std::ignore 的全部目的是成为一个占位符:一种标签。除此之外,它似乎没有任何用处,特别是对于 std::tie。
  • 没有实际应用。我正在制作一个“zip”迭代器(例如,参见 boost),它允许用户压缩一个“虚拟”迭代器。一个用例是支持std::copy_if,当输入迭代器是 zip 迭代器并且输出迭代器是具有(输入的)元组元素子集的 zip 迭代器。我想知道如果将带有ignored 元素的zip 迭代器用作InputIterator 会发生什么,因为operator* 的返回值必须可转换为包含T 类型对象的元组。 (也许DefaultConstructibleity 的要求比必要的要求更高。)

标签: c++ c++11 language-lawyer stdtuple


【解决方案1】:

标准对ignore 的类型没有要求,除了它是一个不同于所有其他类型的类型。

标准库容器在与tie 一起使用时允许ignore 获得所需行为的任​​何机制取决于该标准库实现。库可能给它一个template<T&> operator=(const T&) 重载,或者它可能使用一些其他机制使其工作。标准没有说。所以它甚至不必是CopyAssignable

请注意,tie 仅在您专门使用 ignore 时才具有特殊行为。如果您使用自己创建的其他值(由于该类型没有要求,因此不能保证您能够做到),您将获得未定义的行为。

【讨论】:

    【解决方案2】:

    据我所知,由于 std::tie [C++11, 20.4.2.4:7] 的规范,T 的唯一要求是 CopyAssignable

    在形式上,我认为根本没有任何要求。 tie() 可以接受 ignore 作为参数这一事实并不意味着它必须在元组中存储该类型的值:尽管这很可能在实践中会发生,但我认为这不一定由正式规范暗示。

    这是实现定义的行为吗?

    不,行为是未指定的,因为实现不需要记录它(感谢 Pete Becker 澄清这一点)。

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 2011-05-14
      • 2012-04-13
      相关资源
      最近更新 更多