N2976建议constexpr
在标准库中添加一些位置。它指出iostream
s 不适用于constexpr
EXCEPT 结束迭代器。所以istream_iterator
并被istreambuf_iterator
赋予了constexpr
默认构造函数,仅此而已。例如,您可以在整个文件中只出现一次的libstdc++ 实现中看到。constexpr
引发此更改的 LWG 是#1129。它说:
istream_iterator
并且istreambuf_iterator
应该支持文字标记值。默认构造函数经常用于终止范围,并且很容易成为 的字面值istreambuf_iterator
,以及istream_iterator
迭代值类型时。[其余省略]
这对我来说没有多大意义。有人可以给我举个例子来说明他们的意思吗?
N3308是另一篇提到但未解释该问题的论文:
某些
istream_iterator<T>
构造函数必须是constexpr
ifT
是文字类型。目的是允许存储一种T
内联类型的现有实现技术继续工作。[libstdc++ 这样做,_Tp _M_value
] 但是,它实际上排除了这种技术:T
不需要标记的默认和复制构造函数constexpr
,如果没有,则istream_iterator<T>
构造函数不能被实例化为constexpr
。
上面解释了琐碎的复制构造函数和析构函数,但没有解释为什么默认构造函数被标记为 constexpr。
此外,在在线 GCC 5.2.0 上进行测试时,我复制了 libstdc++ 的实现。唯一的变化是我从istream_iterator()
. 在这两种情况下,组件都是相同的。