gpt4 book ai didi

c++ - constexpr end istream (sentinel) 迭代器有什么意义?

转载 作者:可可西里 更新时间:2023-11-01 16:18:57 27 4
gpt4 key购买 nike

N2976建议添加constexpr到标准库中的某些位置。它指出 iostream s 不适合 constexpr除了结束迭代器。所以istream_iteratoristreambuf_iterator给出了 constexpr默认构造函数,仅此而已。例如,您可以在 libstdc++ implementation 中看到那constexpr在整个文件中只出现一次。引发此更改的 LWG 是 #1129 .它说:

istream_iterator and istreambuf_iterator should support literal sentinel values. The default constructor is frequently used to terminate ranges, and could easily be a literal value for istreambuf_iterator, and istream_iterator when iterating value types. [Rest omitted]

这对我来说意义不大。谁能给我举个例子说明它们的意思?

N3308是另一篇提到但没有解释问题的论文:

Some of the istream_iterator<T> constructors are required to be constexpr if T is a literal type. The intention is to allow existing implementation technique of storing a type of T inline to continue to work. [libstdc++ does this, _Tp _M_value] However, it actually rules out this technique: the default and copy constructors of T need not be marked constexpr, and if they are not, the istream_iterator<T> constructors could not be instantiated as constexpr.

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

此外,在线测试GCC 5.2.0,我复制了libstdc++的实现。唯一的变化是我从 istream_iterator() 中删除了 constexpr .在这两种情况下,程序集都是相同的。

With constexpr

Without constexpr

最佳答案

这里有一个流迭代器的结尾被用作标记值的例子:

// 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 允许编译器将创建流结束迭代器的调用折叠为常量,而不是每次都调用一个函数。否则,它可能必须在循环的每次迭代中都这样做。

关于c++ - constexpr end istream (sentinel) 迭代器有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32665765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com