CWG Issue 1734 (original) (raw)

This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 117a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2025-04-13


1734. Nontrivial deleted copy functions

Section: 11.4.5.3 [class.copy.ctor]Status: CD4Submitter: James WidmanDate: 2013-08-09

[Adopted at the February, 2016 meeting.]

The intent was for PODs in C++11 to be a superset of C++03 PODs. Consequently, in the following example, C should be a POD but isn't:

struct A { const int m; A& operator=(A const&) = default; // deleted and trivial, so A is a // POD, as it would be in 2003 // without this explicit op= decl }; static_assert(__is_trivially_copyable(A), "");

struct B { int i; B& operator=(B &) & = default; // non-trivial B& operator=(B const&) & = default; // trivial };

struct C { const B m; C& operator=(C const& r) = default; // deleted (apparently), but non-trivial (apparently) /* Notionally: C& operator=(C const& r) { (*this).m.operator=(r.m); return *this; } */ }; static_assert(!__is_trivially_copyable(C), "");

This is because of the following text from 11.4.5.3 [class.copy.ctor] paragraph 25:

for each non-static data member of X that is of class type (or array thereof), the assignment operator selected to copy/move that member is trivial;

In this case, overload resolution fails, so no assignment operator is selected, so C::operator=(const C&) is non-trivial.

(See also issue 1928.)

Additional note, November, 2014:

See paper N4148.

Additional note, October, 2015:

Moved from "extension" to "open" status, along withissue 1928, to allow reconsideration by CWG. It has been suggested that the triviality of a deleted function should be irrelevant, since it cannot be used in any event. A possible change to implement that, more conservative than the one proposed in N4148, would be:

A trivially copyable class is a class that:

Proposed resolution (October, 2015):

Change Clause 11 [class] paragraph 6 as follows:

A trivially copyable class is a class that: