C++ 什么';constexpr end istream(sentinel)迭代器的作用是什么?

C++ 什么';constexpr end istream(sentinel)迭代器的作用是什么?,c++,c++11,constexpr,istream-iterator,C++,C++11,Constexpr,Istream Iterator,建议将constexpr添加到标准库中的某些点。它注意到,iostreams不适用于constexpr,除了结束迭代器。因此,istream\u迭代器和istreambuf\u迭代器被赋予了constexpr默认构造函数,仅此而已。例如,您可以在中看到,constexpr在整个文件中只出现一次。引发这一变化的LWG是。它说: istream\u迭代器和istreambuf\u迭代器应支持文字 哨兵价值观。默认构造函数经常用于 终止范围,并且可以很容易地成为 istreambuf\u迭代器,以及迭

建议将
constexpr
添加到标准库中的某些点。它注意到,
iostream
s不适用于
constexpr
,除了结束迭代器。因此,
istream\u迭代器
istreambuf\u迭代器
被赋予了
constexpr
默认构造函数,仅此而已。例如,您可以在中看到,
constexpr
在整个文件中只出现一次。引发这一变化的LWG是。它说:

istream\u迭代器
istreambuf\u迭代器
应支持文字 哨兵价值观。默认构造函数经常用于 终止范围,并且可以很容易地成为
istreambuf\u迭代器
,以及迭代值时的
istream\u迭代器
类型。[其余省略]

这对我来说没什么意义。有人能给我举个例子说明他们的意思吗

另一篇文章提到但没有解释这个问题:

一些
istream\u迭代器
构造函数需要
constepr
如果
T
是文本类型。目的是允许 将一种类型的
T
内联存储到 继续工作。[libstdc++可以做到这一点,
\u Tp\u M\u value
]但是 实际上排除了这种技术:默认构造函数和复制构造函数 不需要标记
T
constexpr
,如果不标记,则
istream\u迭代器
构造函数无法实例化为
constexpr

上面解释了简单的复制构造函数和析构函数,但没有解释为什么默认构造函数被标记为constexpr

此外,在在线GCC5.2.0上测试时,我复制了libstdc++的实现。唯一的变化是我从
istream\u iterator()
中删除了constexpr。在这两种情况下,部件是相同的


流结束迭代器用作sentinel值的示例如下:

// 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;
}
//istream\u迭代器示例
#包括//标准::cin,标准::cout
#include//std::istream\u迭代器
int main(){
双重价值1,价值2;

std::cout什么不清楚?默认构造的流迭代器通常用作结束迭代器,如
while(iter!=istream\u iterator())
。将其作为
constexpr
可能会在循环中为我们节省一到两纳秒。@BoPersson如果只有末端迭代器可以是
constexpr
,表达式
constexpr
如何将证明一个缺陷、一篇论文是合理的,然后库实现者认为它值得开发时间)我假设一个“移动”迭代器需要调用活动数据,这样它的状态就不能在编译时确定。但是一个终止迭代器可以是完全静态的,并且可以在编译时完全推断出来,因为它所要做的就是与一个耗尽数据的“移动”迭代器进行比较。表达式不是
constexpr
(无论如何,这不能作为循环条件使用),但将
iter
与常量进行比较可能比与其他常量进行比较便宜。@BoPersson在静态初始化阶段允许常量初始化不是吗?非静态存储持续时间临时本地对象可以静态初始化吗?抱歉,这不是一个令人信服的参数。将产生完全相同的程序集。@user5353075这是1实现的一种特殊情况。拥有它可以保证所有编译器和一般情况下都是相同的。如果您要检查标准库并找出什么可以成为constexpr,那么省略一些东西是没有意义的,即使没有真正的好处(在一个编译器上)今天。@nos不应该
eos
有静态或线程存储持续时间来保证在编译时执行初始化?简单的例子:
while(iit!=istream\u iterator())
@nos这里是(我删除了一些特定于GCC的东西,并用
std::
限定了名称).我想在MSVC上测试,但VS2013不支持constexpr。