hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2016 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".
 
(a) The FSF's Front-Cover Text is:
 
A GNU Manual
 
(b) The FSF's Back-Cover Text is:
 
You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNU Compiler Collection (GCC): Copy Assignment</title>
 
<meta name="description" content="Using the GNU Compiler Collection (GCC): Copy Assignment">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): Copy Assignment">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings" rel="up" title="C++ Misunderstandings">
<link href="Non_002dbugs.html#Non_002dbugs" rel="next" title="Non-bugs">
<link href="Temporaries.html#Temporaries" rel="prev" title="Temporaries">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Copy-Assignment"></a>
<div class="header">
<p>
Previous: <a href="Temporaries.html#Temporaries" accesskey="p" rel="prev">Temporaries</a>, Up: <a href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings" accesskey="u" rel="up">C++ Misunderstandings</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Implicit-Copy_002dAssignment-for-Virtual-Bases"></a>
<h4 class="subsection">13.7.4 Implicit Copy-Assignment for Virtual Bases</h4>
 
<p>When a base class is virtual, only one subobject of the base class
belongs to each full object.  Also, the constructors and destructors are
invoked only once, and called from the most-derived class.  However, such
objects behave unspecified when being assigned.  For example:
</p>
<div class="smallexample">
<pre class="smallexample">struct Base{
  char *name;
  Base(char *n) : name(strdup(n)){}
  Base&amp; operator= (const Base&amp; other){
   free (name);
   name = strdup (other.name);
  }
};
 
struct A:virtual Base{
  int val;
  A():Base(&quot;A&quot;){}
};
 
struct B:virtual Base{
  int bval;
  B():Base(&quot;B&quot;){}
};
 
struct Derived:public A, public B{
  Derived():Base(&quot;Derived&quot;){}
};
 
void func(Derived &amp;d1, Derived &amp;d2)
{
  d1 = d2;
}
</pre></div>
 
<p>The C++ standard specifies that &lsquo;<samp>Base::Base</samp>&rsquo; is only called once
when constructing or copy-constructing a Derived object.  It is
unspecified whether &lsquo;<samp>Base::operator=</samp>&rsquo; is called more than once when
the implicit copy-assignment for Derived objects is invoked (as it is
inside &lsquo;<samp>func</samp>&rsquo; in the example).
</p>
<p>G++ implements the &ldquo;intuitive&rdquo; algorithm for copy-assignment: assign all
direct bases, then assign all members.  In that algorithm, the virtual
base subobject can be encountered more than once.  In the example, copying
proceeds in the following order: &lsquo;<samp>val</samp>&rsquo;, &lsquo;<samp>name</samp>&rsquo; (via
<code>strdup</code>), &lsquo;<samp>bval</samp>&rsquo;, and &lsquo;<samp>name</samp>&rsquo; again.
</p>
<p>If application code relies on copy-assignment, a user-defined
copy-assignment operator removes any uncertainties.  With such an
operator, the application can define whether and how the virtual base
subobject is assigned.
</p>
 
 
 
</body>
</html>