C++ copy constructor called at returnWhen to use virtual destructors?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?

Is there any evidence that Cleopatra and Caesarion considered fleeing to India to escape the Romans?

Is it allowed to activate the ability of multiple planeswalkers in a single turn?

How could a planet have erratic days?

Which was the first story featuring espers?

Multiplicative persistence

When were female captains banned from Starfleet?

Non-trope happy ending?

What are some good ways to treat frozen vegetables such that they behave like fresh vegetables when stir frying them?

Biological Blimps: Propulsion

Do we have to expect a queue for the shuttle from Watford Junction to Harry Potter Studio?

PTIJ: Why is Haman obsessed with Bose?

The Digit Triangles

How do I fix the group tension caused by my character stealing and possibly killing without provocation?

How to convince somebody that he is fit for something else, but not this job?

Does an advisor owe his/her student anything? Will an advisor keep a PhD student only out of pity?

Does the reader need to like the PoV character?

Creating two special characters

What is the highest possible scrabble score for placing a single tile

What is the English pronunciation of "pain au chocolat"?

Which Article Helped Get Rid of Technobabble in RPGs?

Can I cause damage to electrical appliances by unplugging them when they are turned on?

What features enable the Su-25 Frogfoot to operate with such a wide variety of fuels?

What to do when eye contact makes your coworker uncomfortable?

Can I turn my anal-retentiveness into a career?



C++ copy constructor called at return


When to use virtual destructors?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?













9















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;










share|improve this question









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.




















  • see: In which situations is the C++ copy constructor called?

    – kmdreko
    4 hours ago






  • 3





    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
    4 hours ago















9















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;










share|improve this question









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.




















  • see: In which situations is the C++ copy constructor called?

    – kmdreko
    4 hours ago






  • 3





    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
    4 hours ago













9












9








9


1






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;










share|improve this question









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++






share|improve this question









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.











share|improve this question









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.









share|improve this question




share|improve this question








edited 3 hours 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 4 hours ago









SobuchSobuch

485




485




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.












  • see: In which situations is the C++ copy constructor called?

    – kmdreko
    4 hours ago






  • 3





    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
    4 hours ago

















  • see: In which situations is the C++ copy constructor called?

    – kmdreko
    4 hours ago






  • 3





    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
    4 hours ago
















see: In which situations is the C++ copy constructor called?

– kmdreko
4 hours ago





see: In which situations is the C++ copy constructor called?

– kmdreko
4 hours ago




3




3





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
4 hours 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
4 hours ago












1 Answer
1






active

oldest

votes


















20














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;
;





share|improve this answer




















  • 6





    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
    4 hours ago






  • 2





    @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
    4 hours 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
    4 hours ago







  • 3





    @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
    4 hours ago






  • 3





    @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
    4 hours ago











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.









draft saved

draft discarded


















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









20














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;
;





share|improve this answer




















  • 6





    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
    4 hours ago






  • 2





    @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
    4 hours 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
    4 hours ago







  • 3





    @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
    4 hours ago






  • 3





    @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
    4 hours ago
















20














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;
;





share|improve this answer




















  • 6





    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
    4 hours ago






  • 2





    @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
    4 hours 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
    4 hours ago







  • 3





    @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
    4 hours ago






  • 3





    @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
    4 hours ago














20












20








20







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;
;





share|improve this answer















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;
;






share|improve this answer














share|improve this answer



share|improve this answer








edited 4 hours ago

























answered 4 hours ago









NathanOliverNathanOliver

96k16136209




96k16136209







  • 6





    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
    4 hours ago






  • 2





    @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
    4 hours 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
    4 hours ago







  • 3





    @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
    4 hours ago






  • 3





    @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
    4 hours ago













  • 6





    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
    4 hours ago






  • 2





    @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
    4 hours 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
    4 hours ago







  • 3





    @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
    4 hours ago






  • 3





    @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
    4 hours ago








6




6





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
4 hours 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
4 hours ago




2




2





@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
4 hours 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
4 hours 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
4 hours 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
4 hours ago





3




3





@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
4 hours 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
4 hours ago




3




3





@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
4 hours 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
4 hours ago













Sobuch is a new contributor. Be nice, and check out our Code of Conduct.









draft saved

draft discarded


















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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

The Calvary Singular or Plural The 2019 Stack Overflow Developer Survey Results Are InAre collective nouns always plural, or are certain ones singular?Is “audience” singular or plural?“Wasn't” vs. “weren't” in a vernacular sentence“My last couple of years” — singular or plural?Is 'rest' singular or plural?Is “all but one” singular or plural?Whether to use the singular or plural form of basis?Singular and Plural for numbersIs there a plural form of teeth?performance: plural vs singular?singular or plural nouns?Singular and Plural

How does one intimidate enemies without having the capacity for violence?Ideas for how aliens would approach this fight?How to convey the scale of my humanoid without science or units?How does the “space drive” conserve momentum?Planet Vanishes - How does this affect the orbiting starships?How does a community of a Universe Simulator have the same language as its creator?How would US Presidential elections be affected if voters could choose the state their vote for President was counted in?How Does One Ensures the Immortality of Their ConsciousnessHow do I retain national independence while also having a one world government?How can Ganymede have an Earth-like gravity without us having realized it?How would one make a lion mount for a fantasy world?

Output visual diagram of pictureASCII-art logic gate diagramBooks on a ShelfDetermine the Dimensions of a Rotated RectangleDraw a Houndstooth PatternDraw and label an ASCII hexagonal gridGolf me an ASCII AlphabetASCII Jigsaw PuzzleOutput a pretty boxASCII-Art Venn DiagramASCII Exact Cover with Rectangles