[cfe-dev] std::pair not trivially copyable?

Nevin Liber via cfe-dev cfe-dev at lists.llvm.org
Wed Aug 26 10:17:55 PDT 2020

On Tue, Aug 25, 2020 at 4:37 PM David Blaikie via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> From what I can tell, reading this (
> https://stackoverflow.com/questions/58283694/why-is-pair-of-const-trivially-copyable-but-pair-is-not )
> and the C++17 spec, it just doesn't specify the copy and move assignment
> operators as defaulted, or say anything about their triviality, so they
> aren't trivial even for trivial types. Perhaps an oversight when thinking
> about the other complexities of when they shuold be deleted.

In general, move/copy assignment cannot be defaulted for pair, because
assignment of reference types has meaning:

int i = 2;
int j = 3;
std::pair<int&, int> p1(i, 5);
std::pair<int&, int> p2(j, 7);
p2 = p1;  // j now has the value 2

struct A
    A(int& r_, int i_) : r(r_), i(i_) {}
    int& r;
    int i;

int i = 2;
int j = 3;
A a1(i, 5);
A a2(j, 7);
a2 = a1;  // Compile time error - deleted copy assignment operator

Now,  this doesn't that pair couldn't have trivial copy/move assignment
operators when it holds trivially copy/move assignable types, but I don't
know how much of an ABI break this would be.
 Nevin ":-)" Liber  <mailto:nevin at cplusplusguy.com <nevin at eviloverlord.com>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20200826/8d99a9ac/attachment.html>

More information about the cfe-dev mailing list