std :: ignore的要求

时间:2013-05-23 19:01:52

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

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

const /* unspecified */ ignore;

为简洁起见,让

typedef decltype(std::ignore) T; 

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

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

(如果我错过了T的其他要求,请详细说明。)

2 个答案:

答案 0 :(得分:14)

标准对ignore的类型有 no 要求,除了它是一种与所有其他类型不同的类型。

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

请注意,如果您专门使用tie ignore只会有特殊行为。如果您使用由您自己创建的其他值(由于该类型没有要求,您无法保证能够这样做),您将得到未定义的行为。

答案 1 :(得分:8)

  

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

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

  

这是实现定义的行为吗?

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