std :: ignore的要求

nkn*_*ght 14 c++ language-lawyer c++11 stdtuple

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

const /* unspecified */ ignore;
Run Code Online (Sandbox Code Playgroud)

为简洁起见,让我们

typedef decltype(std::ignore) T; 
Run Code Online (Sandbox Code Playgroud)

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

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

(如果T我有其他要求,请详细说明.)

Nic*_*las 14

除了它是一种与所有其他类型不同的类型之外,该标准对类型没有要求ignore.

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

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


And*_*owl 8

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

在形式上,我认为根本没有任何要求.这个事实tie()可以接受ignore作为参数并不意味着它具有存储类型中的元组的值:尽管这是最有可能发生了什么事在实践中发生的,我不认为这是在正式的规范进行一定暗示.

这是实现定义的行为吗?

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