[Bug libstdc++/64814] New: std::copy_n advances InputIterator one *less* time than necessary.
alex-j-a at hotmail dot co.uk
gcc-bugzilla@gcc.gnu.org
Tue Jan 27 03:49:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64814
Bug ID: 64814
Summary: std::copy_n advances InputIterator one *less* time
than necessary.
Product: gcc
Version: 4.9.2
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: alex-j-a at hotmail dot co.uk
Bug 50119 is related. The issue should be clear from the example below; I've
confirmed the output on several web-based compilers (I'm using a chromebook in
standard config) all of which claim to use GCC.
minimal failing example:
#include <iostream>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <string>
int main() {
std::istringstream ss("123456789012");
std::string output;
auto readIter = std::istreambuf_iterator<char>(ss);
for (int i = 0; i < 3; ++i) {
output.clear();
auto inserter = std::back_inserter(output);
// Works - outputs 123456789012
//for (int j = 0; j < 4; ++j)
// *inserter++ = *readIter++;
// Doesn't work - outputs 123445677890
std::copy_n(readIter, 4, inserter);
std::cout << output;
}
}
The following works perfectly as a drop-in replacement from my tests:
template <typename InputIt, typename SizeT, typename OutputIt>
OutputIt copy_n(InputIt first, SizeT count, OutputIt result) {
for (; count > 0; --count)
*result++ = *first++;
return result;
}
More information about the Gcc-bugs
mailing list