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的其他要求,请详细说明。)
发布于 2013-05-24 03:11:48
该标准对ignore的类型没有要求,除了它是一种与所有其他类型不同的类型之外。
当与tie一起使用时,标准库容器为允许ignore获得所需行为所做的任何工作都符合该标准库实现的要求。库可能会给它一个template<T&> operator=(const T&)重载,或者它可能会使用一些其他的机制来使它工作。标准上没说。所以它甚至不需要是CopyAssignable。
请注意,只有当您专门使用ignore时,tie才有特殊的行为。如果您使用自己创建的其他值(由于类型没有要求,因此不能保证您能够这样做),您将得到未定义的行为。
发布于 2013-05-24 03:12:00
据我所知,根据
std::tieC++11,20.4.2.4:7的规范,对T的唯一要求是它必须是CopyAssignable。
从形式上讲,我认为根本没有任何要求。tie()可以接受ignore作为参数这一事实并不意味着它必须在元组中存储该类型的值:尽管在实践中很可能会发生这种情况,但我并不认为正式规范一定会暗示这一点。
这是实现定义的行为吗?
不,行为是未指定的,因为实现不需要记录它(感谢Pete Becker澄清了这一点)。
https://stackoverflow.com/questions/16721884
复制相似问题