Saturday, June 29, 2019

How are C++ array members handled in copy control functions?




This is something I have wondered for a long time. Take the following example:



struct matrix
{
float data[16];
};


I know what the default constructor and destructor do in this specific example (nothing), but what about the copy constructor and the copy assignment operator?




struct matrix
{
float data[16];

// automatically generated copy constructor
matrix(const matrix& that) : // What happens here?
{
// (or here?)
}


// automatically generated copy assignment operator
matrix& operator=(const matrix& that)
{
// What happens here?

return *this;
}
};



Does it involve std::copy or std::uninitialized_copy or memcpy or memmove or what?


Answer



This is what the standard says in 12.8 (Copying class objects). Copy construction:




Each subobject is copied in the manner appropriate to its type:




  • if the subobject is of class type, the copy constructor for the class is used;

  • if the subobject is an array, each element is copied, in the manner appropriate to the element type;


  • if the subobject is of scalar type, the built-in assignment operator is used.




Copy assignment:




Each subobject is assigned in the manner appropriate to its type:





  • if the subobject is of class type, the copy assignment operator for the class is used (as if by explicit qualification; that is, ignoring any possible virtual overriding functions in more derived classes);

  • if the subobject is an array, each element is assigned, in the manner appropriate to the element type;

  • if the subobject is of scalar type, the built-in assignment operator is used.



No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...