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
的其他要求,请详细说明。)
答案 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澄清这一点)。