C++ copy constructor called at returnIn which situations is the C++ copy constructor called?What are the differences between a pointer variable and a reference variable in C++?Why don't C++ compilers define operator== and operator!=?What is the lifetime of a static variable in a C++ function?Can I call a constructor from another constructor (do constructor chaining) in C++?Inheriting constructorsHow can I profile C++ code running on Linux?The Definitive C++ Book Guide and ListWhen to use virtual destructors?What is the “-->” operator in C++?What is the copy-and-swap idiom?
What are some good ways to treat frozen vegetables such that they behave like fresh vegetables when stir frying them?
What does Apple's new App Store requirement mean
Why is so much work done on numerical verification of the Riemann Hypothesis?
Shouldn’t conservatives embrace universal basic income?
What (the heck) is a Super Worm Equinox Moon?
When were female captains banned from Starfleet?
15% tax on $7.5k earnings. Is that right?
Why do Radio Buttons not fill the entire outer circle?
What is the difference between lands and mana?
Can you use Vicious Mockery to win an argument or gain favours?
What is going on with gets(stdin) on the site coderbyte?
Biological Blimps: Propulsion
GCD of cubic polynomials
Is it ethical to recieve stipend after publishing enough papers?
A Trivial Diagnosis
Is there a RAID 0 Equivalent for RAM?
What is the English pronunciation of "pain au chocolat"?
What features enable the Su-25 Frogfoot to operate with such a wide variety of fuels?
Are Captain Marvel's powers affected by Thanos breaking the Tesseract and claiming the stone?
Is there any evidence that Cleopatra and Caesarion considered fleeing to India to escape the Romans?
A variation to the phrase "hanging over my shoulders"
How much of a Devil Fruit must be consumed to gain the power?
Why can't the Brexit deadlock in the UK parliament be solved with a plurality vote?
Change the color of a single dot in `ddot` symbol
C++ copy constructor called at return
In which situations is the C++ copy constructor called?What are the differences between a pointer variable and a reference variable in C++?Why don't C++ compilers define operator== and operator!=?What is the lifetime of a static variable in a C++ function?Can I call a constructor from another constructor (do constructor chaining) in C++?Inheriting constructorsHow can I profile C++ code running on Linux?The Definitive C++ Book Guide and ListWhen to use virtual destructors?What is the “-->” operator in C++?What is the copy-and-swap idiom?
error: use of deleted function 'A::A(const A&)'
return tmp;
^~~
Why is the copy constructor called only when there is a virtual destructor in A? How to avoid this?
struct B ;
struct A
std::unique_ptr<B> x;
virtual ~A() = default;
;
A f()
A tmp;
return tmp;
c++
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
error: use of deleted function 'A::A(const A&)'
return tmp;
^~~
Why is the copy constructor called only when there is a virtual destructor in A? How to avoid this?
struct B ;
struct A
std::unique_ptr<B> x;
virtual ~A() = default;
;
A f()
A tmp;
return tmp;
c++
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
At the moment, I can't verify that snippet because there's noBgiven.
– Tzalumen
59 mins ago
see: In which situations is the C++ copy constructor called?
– kmdreko
57 mins ago
2
C++ handles objects different than C#/Java. When an instance goes out of scope (tmphere) its destructor must be called. Therefore, when youreturn tmpthen you're asking it to make a copy oftmpto be return to whomever calls the function. Once copied,tmpwill be destroyed and its copy will be available for use.
– Everyone
57 mins ago
add a comment |
error: use of deleted function 'A::A(const A&)'
return tmp;
^~~
Why is the copy constructor called only when there is a virtual destructor in A? How to avoid this?
struct B ;
struct A
std::unique_ptr<B> x;
virtual ~A() = default;
;
A f()
A tmp;
return tmp;
c++
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
error: use of deleted function 'A::A(const A&)'
return tmp;
^~~
Why is the copy constructor called only when there is a virtual destructor in A? How to avoid this?
struct B ;
struct A
std::unique_ptr<B> x;
virtual ~A() = default;
;
A f()
A tmp;
return tmp;
c++
c++
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited 8 mins ago
Sobuch
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked 1 hour ago
SobuchSobuch
335
335
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
Sobuch is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
At the moment, I can't verify that snippet because there's noBgiven.
– Tzalumen
59 mins ago
see: In which situations is the C++ copy constructor called?
– kmdreko
57 mins ago
2
C++ handles objects different than C#/Java. When an instance goes out of scope (tmphere) its destructor must be called. Therefore, when youreturn tmpthen you're asking it to make a copy oftmpto be return to whomever calls the function. Once copied,tmpwill be destroyed and its copy will be available for use.
– Everyone
57 mins ago
add a comment |
At the moment, I can't verify that snippet because there's noBgiven.
– Tzalumen
59 mins ago
see: In which situations is the C++ copy constructor called?
– kmdreko
57 mins ago
2
C++ handles objects different than C#/Java. When an instance goes out of scope (tmphere) its destructor must be called. Therefore, when youreturn tmpthen you're asking it to make a copy oftmpto be return to whomever calls the function. Once copied,tmpwill be destroyed and its copy will be available for use.
– Everyone
57 mins ago
At the moment, I can't verify that snippet because there's no
B given.– Tzalumen
59 mins ago
At the moment, I can't verify that snippet because there's no
B given.– Tzalumen
59 mins ago
see: In which situations is the C++ copy constructor called?
– kmdreko
57 mins ago
see: In which situations is the C++ copy constructor called?
– kmdreko
57 mins ago
2
2
C++ handles objects different than C#/Java. When an instance goes out of scope (
tmp here) its destructor must be called. Therefore, when you return tmp then you're asking it to make a copy of tmp to be return to whomever calls the function. Once copied, tmp will be destroyed and its copy will be available for use.– Everyone
57 mins ago
C++ handles objects different than C#/Java. When an instance goes out of scope (
tmp here) its destructor must be called. Therefore, when you return tmp then you're asking it to make a copy of tmp to be return to whomever calls the function. Once copied, tmp will be destroyed and its copy will be available for use.– Everyone
57 mins ago
add a comment |
1 Answer
1
active
oldest
votes
virtual ~A() = default; is a user declared destructor. Because of that, A no longer has a move constructor. That means return tmp; can't move tmp and since tmp is not copyable, you get a compiler error.
There are two ways you can fix this. You can add a move constructor like
struct A
std::unique_ptr<B> x;
A() = default; // you have to add this since the move constructor was added
A(A&&) = default; // defaulted move
virtual ~A() = default;
;
or you can create a base class that has the virtual destructor and inherit from that like
struct C
virtual ~C() = default;
;
struct A : C
std::unique_ptr<B> x;
;
4
Better to follow the Rule of Zero/Five. Either add all of (copy ctor, move ctor, copy assignment, move assignment, destructor) or add none of them. In this example, none of them are necessary.
– 0x5453
53 mins ago
1
@0x5453 Unless this is a parent class and the OP wants the derived classes to get destroyed properly. You need a virtual destructor if you have polymorphism.
– NathanOliver
51 mins ago
2
@Tzalumen no delete is required (because that's what the unique pointer does for you), but a virtual destructor is required so that the unique pointer won't have UB.
– eerorika
46 mins ago
2
@Tzalumen If youdeletean object of classXthrough a pointer to a base class ofXand that base class doesn't have a virtual dtor, it's Undefined Behaviour. Regardless of what the destructor does.
– Angew
45 mins ago
2
@Tzalumen If you have polymorphism, you must have a virtual destructor. If you don't the destructor for the derived class won't be called and you have UB.
– NathanOliver
44 mins ago
|
show 15 more comments
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sobuch is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55288708%2fc-copy-constructor-called-at-return%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
virtual ~A() = default; is a user declared destructor. Because of that, A no longer has a move constructor. That means return tmp; can't move tmp and since tmp is not copyable, you get a compiler error.
There are two ways you can fix this. You can add a move constructor like
struct A
std::unique_ptr<B> x;
A() = default; // you have to add this since the move constructor was added
A(A&&) = default; // defaulted move
virtual ~A() = default;
;
or you can create a base class that has the virtual destructor and inherit from that like
struct C
virtual ~C() = default;
;
struct A : C
std::unique_ptr<B> x;
;
4
Better to follow the Rule of Zero/Five. Either add all of (copy ctor, move ctor, copy assignment, move assignment, destructor) or add none of them. In this example, none of them are necessary.
– 0x5453
53 mins ago
1
@0x5453 Unless this is a parent class and the OP wants the derived classes to get destroyed properly. You need a virtual destructor if you have polymorphism.
– NathanOliver
51 mins ago
2
@Tzalumen no delete is required (because that's what the unique pointer does for you), but a virtual destructor is required so that the unique pointer won't have UB.
– eerorika
46 mins ago
2
@Tzalumen If youdeletean object of classXthrough a pointer to a base class ofXand that base class doesn't have a virtual dtor, it's Undefined Behaviour. Regardless of what the destructor does.
– Angew
45 mins ago
2
@Tzalumen If you have polymorphism, you must have a virtual destructor. If you don't the destructor for the derived class won't be called and you have UB.
– NathanOliver
44 mins ago
|
show 15 more comments
virtual ~A() = default; is a user declared destructor. Because of that, A no longer has a move constructor. That means return tmp; can't move tmp and since tmp is not copyable, you get a compiler error.
There are two ways you can fix this. You can add a move constructor like
struct A
std::unique_ptr<B> x;
A() = default; // you have to add this since the move constructor was added
A(A&&) = default; // defaulted move
virtual ~A() = default;
;
or you can create a base class that has the virtual destructor and inherit from that like
struct C
virtual ~C() = default;
;
struct A : C
std::unique_ptr<B> x;
;
4
Better to follow the Rule of Zero/Five. Either add all of (copy ctor, move ctor, copy assignment, move assignment, destructor) or add none of them. In this example, none of them are necessary.
– 0x5453
53 mins ago
1
@0x5453 Unless this is a parent class and the OP wants the derived classes to get destroyed properly. You need a virtual destructor if you have polymorphism.
– NathanOliver
51 mins ago
2
@Tzalumen no delete is required (because that's what the unique pointer does for you), but a virtual destructor is required so that the unique pointer won't have UB.
– eerorika
46 mins ago
2
@Tzalumen If youdeletean object of classXthrough a pointer to a base class ofXand that base class doesn't have a virtual dtor, it's Undefined Behaviour. Regardless of what the destructor does.
– Angew
45 mins ago
2
@Tzalumen If you have polymorphism, you must have a virtual destructor. If you don't the destructor for the derived class won't be called and you have UB.
– NathanOliver
44 mins ago
|
show 15 more comments
virtual ~A() = default; is a user declared destructor. Because of that, A no longer has a move constructor. That means return tmp; can't move tmp and since tmp is not copyable, you get a compiler error.
There are two ways you can fix this. You can add a move constructor like
struct A
std::unique_ptr<B> x;
A() = default; // you have to add this since the move constructor was added
A(A&&) = default; // defaulted move
virtual ~A() = default;
;
or you can create a base class that has the virtual destructor and inherit from that like
struct C
virtual ~C() = default;
;
struct A : C
std::unique_ptr<B> x;
;
virtual ~A() = default; is a user declared destructor. Because of that, A no longer has a move constructor. That means return tmp; can't move tmp and since tmp is not copyable, you get a compiler error.
There are two ways you can fix this. You can add a move constructor like
struct A
std::unique_ptr<B> x;
A() = default; // you have to add this since the move constructor was added
A(A&&) = default; // defaulted move
virtual ~A() = default;
;
or you can create a base class that has the virtual destructor and inherit from that like
struct C
virtual ~C() = default;
;
struct A : C
std::unique_ptr<B> x;
;
edited 38 mins ago
answered 54 mins ago
NathanOliverNathanOliver
96k16135209
96k16135209
4
Better to follow the Rule of Zero/Five. Either add all of (copy ctor, move ctor, copy assignment, move assignment, destructor) or add none of them. In this example, none of them are necessary.
– 0x5453
53 mins ago
1
@0x5453 Unless this is a parent class and the OP wants the derived classes to get destroyed properly. You need a virtual destructor if you have polymorphism.
– NathanOliver
51 mins ago
2
@Tzalumen no delete is required (because that's what the unique pointer does for you), but a virtual destructor is required so that the unique pointer won't have UB.
– eerorika
46 mins ago
2
@Tzalumen If youdeletean object of classXthrough a pointer to a base class ofXand that base class doesn't have a virtual dtor, it's Undefined Behaviour. Regardless of what the destructor does.
– Angew
45 mins ago
2
@Tzalumen If you have polymorphism, you must have a virtual destructor. If you don't the destructor for the derived class won't be called and you have UB.
– NathanOliver
44 mins ago
|
show 15 more comments
4
Better to follow the Rule of Zero/Five. Either add all of (copy ctor, move ctor, copy assignment, move assignment, destructor) or add none of them. In this example, none of them are necessary.
– 0x5453
53 mins ago
1
@0x5453 Unless this is a parent class and the OP wants the derived classes to get destroyed properly. You need a virtual destructor if you have polymorphism.
– NathanOliver
51 mins ago
2
@Tzalumen no delete is required (because that's what the unique pointer does for you), but a virtual destructor is required so that the unique pointer won't have UB.
– eerorika
46 mins ago
2
@Tzalumen If youdeletean object of classXthrough a pointer to a base class ofXand that base class doesn't have a virtual dtor, it's Undefined Behaviour. Regardless of what the destructor does.
– Angew
45 mins ago
2
@Tzalumen If you have polymorphism, you must have a virtual destructor. If you don't the destructor for the derived class won't be called and you have UB.
– NathanOliver
44 mins ago
4
4
Better to follow the Rule of Zero/Five. Either add all of (copy ctor, move ctor, copy assignment, move assignment, destructor) or add none of them. In this example, none of them are necessary.
– 0x5453
53 mins ago
Better to follow the Rule of Zero/Five. Either add all of (copy ctor, move ctor, copy assignment, move assignment, destructor) or add none of them. In this example, none of them are necessary.
– 0x5453
53 mins ago
1
1
@0x5453 Unless this is a parent class and the OP wants the derived classes to get destroyed properly. You need a virtual destructor if you have polymorphism.
– NathanOliver
51 mins ago
@0x5453 Unless this is a parent class and the OP wants the derived classes to get destroyed properly. You need a virtual destructor if you have polymorphism.
– NathanOliver
51 mins ago
2
2
@Tzalumen no delete is required (because that's what the unique pointer does for you), but a virtual destructor is required so that the unique pointer won't have UB.
– eerorika
46 mins ago
@Tzalumen no delete is required (because that's what the unique pointer does for you), but a virtual destructor is required so that the unique pointer won't have UB.
– eerorika
46 mins ago
2
2
@Tzalumen If you
delete an object of class X through a pointer to a base class of X and that base class doesn't have a virtual dtor, it's Undefined Behaviour. Regardless of what the destructor does.– Angew
45 mins ago
@Tzalumen If you
delete an object of class X through a pointer to a base class of X and that base class doesn't have a virtual dtor, it's Undefined Behaviour. Regardless of what the destructor does.– Angew
45 mins ago
2
2
@Tzalumen If you have polymorphism, you must have a virtual destructor. If you don't the destructor for the derived class won't be called and you have UB.
– NathanOliver
44 mins ago
@Tzalumen If you have polymorphism, you must have a virtual destructor. If you don't the destructor for the derived class won't be called and you have UB.
– NathanOliver
44 mins ago
|
show 15 more comments
Sobuch is a new contributor. Be nice, and check out our Code of Conduct.
Sobuch is a new contributor. Be nice, and check out our Code of Conduct.
Sobuch is a new contributor. Be nice, and check out our Code of Conduct.
Sobuch is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55288708%2fc-copy-constructor-called-at-return%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
At the moment, I can't verify that snippet because there's no
Bgiven.– Tzalumen
59 mins ago
see: In which situations is the C++ copy constructor called?
– kmdreko
57 mins ago
2
C++ handles objects different than C#/Java. When an instance goes out of scope (
tmphere) its destructor must be called. Therefore, when youreturn tmpthen you're asking it to make a copy oftmpto be return to whomever calls the function. Once copied,tmpwill be destroyed and its copy will be available for use.– Everyone
57 mins ago