【发布时间】: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