This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug libstdc++/34595] New: std::copy copies the output iterator before assigning
- From: "sylvain dot pion at sophia dot inria dot fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 26 Dec 2007 17:30:02 -0000
- Subject: [Bug libstdc++/34595] New: std::copy copies the output iterator before assigning
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The program below used to print "5". With g++ 4.3, it prints "0".
The program defines an output iterator which stores a counter,
to be incremented on each assignment of the output iterator.
The problem is that std::copy now copies the output iterator before
performing the assignment, so the program does not work anymore.
I am not sure it is a bug, I think it isn't.
Nevertheless, in doubt, I wanted to report the issue, as I think copying
output iterators too many times can also be a source of performance
degradation in some cases.
----------------------------
#include <algorithm>
#include <iostream>
class Counting_output_iterator
: public std::iterator< std::output_iterator_tag, void, void, void, void >
{
std::size_t c;
public:
Counting_output_iterator() : c(0) {}
Counting_output_iterator& operator++() { return *this; }
Counting_output_iterator& operator*() { return *this; }
template <typename T>
void operator=(const T&) { ++c; }
std::size_t current_counter() const { return c; }
};
int main()
{
int t[10] = {0,};
Counting_output_iterator cnt;
std::size_t res = std::copy(t+0, t+5, cnt).current_counter();
std::cout << res << std::endl;
}
--
Summary: std::copy copies the output iterator before assigning
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: sylvain dot pion at sophia dot inria dot fr
GCC host triplet: i386-apple-darwin8.11.1
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34595