Does the behavior of guaranteed copy elision depend on existence of user-defined copy constructor?

前端 未结 1 434
我寻月下人不归
我寻月下人不归 2020-12-03 03:17

The following code behaves differently with or without user-defined copy constructor under GCC 8.0.1:

#include 

struct S {
    int i;
    int         


        
相关标签:
1条回答
  • 2020-12-03 04:02

    Quoting from C++17 Working Draft §15.2 Temporary Objects Paragraph 3 (https://timsong-cpp.github.io/cppwp/class.temporary#3):

    When an object of class type X is passed to or returned from a function, if each copy constructor, move constructor, and destructor of X is either trivial or deleted, and X has at least one non-deleted copy or move constructor, implementations are permitted to create a temporary object to hold the function parameter or result object. ... [ Note: This latitude is granted to allow objects of class type to be passed to or returned from functions in registers. — end note]

    In your case, when I made both copy and move constructors defaulted:

    S(const S &) = default;
    S(S &&) = default;
    

    assertion failed as well with GCC and Clang. Note that implicitly-defined constructors are trivial.

    0 讨论(0)
提交回复
热议问题