N2976建议将constexpr
添加到标准库中的某些位置。它指出iostream
不适合constexpr
除了结束迭代器。因此,istream_iterator
和istreambuf_iterator
被赋予constexpr
默认构造函数,这就是它。例如,您可以在libstdc++ implementation中看到constexpr
仅在整个文件中出现一次。引发这一变化的LWG是#1129。它说:
istream_iterator
和istreambuf_iterator
应支持文字 哨兵价值观。默认构造函数经常用于 终止范围,并且很容易成为字面值 迭代值时istreambuf_iterator
和istream_iterator
类型。 [其余省略]
这对我来说并没有多大意义。有人能告诉我他们的意思吗?
N3308是另一篇提及但未解释此问题的论文:
需要一些
istream_iterator<T>
构造函数 如果constexpr
是文字类型,则T
。目的是允许 存储T
内联类型的现有实现技术 继续工作。 [libstdc ++这样做,_Tp _M_value
]但是,它 实际上排除了这种技术:默认和复制构造函数T
的{{1}}不需要标记为constexpr
,如果不是,则为istream_iterator<T>
constexpr
构造函数无法实例化为istream_iterator()
。
上面解释了普通的复制构造函数和析构函数,但不是默认构造函数标记为constexpr的原因。
此外,在在线GCC 5.2.0上进行测试,我复制了libstdc ++的实现。唯一的变化是我从node *InitQueue(node * head)
{
node *temp;
temp = (node *) malloc(sizeof(node));
printf("%p \n", temp);
temp->next = temp;
head = temp;
printf("%p \n", head->next);
return head;
}
删除了constexpr。在这两种情况下,组件都是相同的。
答案 0 :(得分:3)
用作转发值的流迭代器的结尾示例如下:
// istream_iterator example
#include <iostream> // std::cin, std::cout
#include <iterator> // std::istream_iterator
int main () {
double value1, value2;
std::cout << "Please, insert two values: ";
std::istream_iterator<double> eos; // end-of-stream iterator
std::istream_iterator<double> iit (std::cin); // stdin iterator
if (iit!=eos) value1=*iit;
++iit;
if (iit!=eos) value2=*iit;
std::cout << value1 << "*" << value2 << "=" << (value1*value2) << '\n';
return 0;
}
http://www.cplusplus.com/reference/iterator/istream_iterator/istream_iterator/
声明这个constexpr
允许编译器将创建end-of-stream迭代器的调用折叠成常量,而不是每次都调用一个函数。否则它可能必须在循环的每次迭代中这样做。