From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2108 invoked by alias); 1 Mar 2010 22:38:39 -0000 Received: (qmail 1943 invoked by uid 48); 1 Mar 2010 22:38:24 -0000 Date: Mon, 01 Mar 2010 22:38:00 -0000 Message-ID: <20100301223824.1942.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug libstdc++/43183] std::unique_ptr::reset() does not conform to N3035. In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "redi at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2010-03/txt/msg00104.txt.bz2 ------- Comment #12 from redi at gcc dot gnu dot org 2010-03-01 22:38 ------- Bear in mind that a custom deleter with custom pointer type might have very different semantics for comparing pointer values and for invoking the deleter. Consider a custom D::pointer which keeps a generation count, which is not used when comparing for equality: template struct MyDeleter { struct pointer { int generation; T* ptr; pointer() : generation(), ptr() { } bool operator==(pointer rhs) { return ptr == rhs.ptr; } }; void operator()(pointer p) const { do_something(ptr.generation); delete p.ptr; } void do_something(int gen); }; Your suggested implementation would not update the value, because the equality test is true, but that would be wrong i.e. you would have failed to reset the unique_ptr as requested by the user. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43183