Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Constructor initialization list with empty initialization

Tags:

c++

What does _currentHandle() mean below?

template<class SpiHandleT>
class SpiHandleIterator : public ISpiHandleIterator<SpiHandleT>
{
public:
    SpiHandleIterator() : _currentHandle()
    {
    }
    ...
protected:
    SpiHandleT _currentHandle;
};
like image 204
Baz Avatar asked Jun 22 '12 21:06

Baz


1 Answers

This is known as value-initialization. From the C++03 standard, §8.5/7:

An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.

And from §8.5/5:

To value-initialize an object of type T means:

  • if T is a class type with a user-declared constructor, then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
  • if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;
  • if T is an array type, then each element is value-initialized;
  • otherwise, the object is zero-initialized

To zero-initialize an object of type T means:

  • if T is a scalar type, the object is set to the value of 0 (zero) converted to T;
  • if T is a non-union class type, each nonstatic data member and each base-class subobject is zero-initialized;
  • if T is a union type, the object’s first named data member) is zero-initialized;
  • if T is an array type, each element is zero-initialized;
  • if T is a reference type, no initialization is performed.

So in your case, it depends on the definition of SpiHandleT:

  • If it's a scalar, it will be zero-initialized
  • If it's a class type without a user-declared constructor, its subobjects will be (recursively) value-initialized
  • If it's a class type with a user-declared constructor, it will be default-constructed
like image 113
ildjarn Avatar answered Oct 15 '22 03:10

ildjarn