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?

Does grappling negate Mirror Image?

Did the UK lift the requirement for registering SIM cards?

What does "Scientists rise up against statistical significance" mean? (Comment in Nature)

C++ copy constructor called at return

Is this part of the description of the Archfey warlock's Misty Escape feature redundant?

A variation to the phrase "hanging over my shoulders"

How to explain what's wrong with this application of the chain rule?

Which was the first story featuring espers?

Circuit Analysis: Obtaining Close Loop OP - AMP Transfer function

How to make money from a browser who sees 5 seconds into the future of any web page?

How much theory knowledge is actually used while playing?

Creating two special characters

Does the reader need to like the PoV character?

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

Why Shazam when there is already Superman?

Is there a nicer/politer/more positive alternative for "negates"?

Pre-mixing cryogenic fuels and using only one fuel tank

How does electrical safety system work on ISS?

Why does AES have exactly 10 rounds for a 128-bit key, 12 for 192 bits and 14 for a 256-bit key size?

US tourist/student visa

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

Why is it that I can sometimes guess the next note?

How can ping know if my host is down

Why is so much work done on numerical verification of the Riemann Hypothesis?



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

















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

    – kmdreko
    3 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
    3 hours ago
















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

– kmdreko
3 hours ago





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

– kmdreko
3 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
3 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
3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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 3 hours ago

























answered 3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
    3 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
3 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
3 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
3 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
3 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
3 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
3 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
3 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
3 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
3 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
3 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

Are there any comparative studies done between Ashtavakra Gita and Buddhim?How is it wrong to believe that a self exists, or that it doesn't?Can you criticise or improve Ven. Bodhi's description of MahayanaWas the doctrine of 'Anatta', accepted as doctrine by modern Buddhism, actually taught by the Buddha?Relationship between Buddhism, Hinduism and Yoga?Comparison of Nirvana, Tao and Brahman/AtmaIs there a distinction between “ego identity” and “craving/hating”?Are there many differences between Taoism and Buddhism?Loss of “faith” in buddhismSimilarity between creation in Abrahamic religions and beginning of life in Earth mentioned Agganna Sutta?Are there studies about the difference between meditating in the morning versus in the evening?Can one follow Hinduism and Buddhism at the same time?Are there any prohibitions on participating in other religion's practices?Psychology of 'flow'

Where else does the Shulchan Aruch quote an authority by name?Parashat Metzora+HagadolPesach/PassoverShulchan Aruch UTF-8Anonymous glosses in the Shulchan AruchWhy is the Shulchan Aruch definitive?Siman 32, Kitzur Shulchan Aruch: UntranslatedLitvaks/Yeshivish and Shulchan AruchBuying a Shulchan AruchEnglish version of SHULCHAN ARUCHIs there any place where Shulchan Aruch rules with the Rosh against the Rif and Rambam?Are there practices where Sepharadim do not hold by Shulchan Aruch?5th part of the shulchan aruch

fallocate: fallocate failed: Text file busy in Ubuntu 17.04? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)defragmenting and increasing performance of old lubuntu system with swap partitionIssue with increasing the root partition from the swapthis /usr/bin/dpkg returned error || ubuntu-16.04, 64bitDefault 17.04 swap file locationHow to Resize Ubuntu 17.04 Zesty Swap file size?Ubuntu freezes from online formsMy Laptop is not starting after upgrade ubuntu 16.04 (Kernel 4.8.0-38 to 04.10.0-36)hcp: ERROR: FALLOCATE FAILED!Not sure my swap is being usedWine 3.0 asking for more virtual free swap