Search code examples
c++c++11templatesinheritanceclass-template

Using-declaration for base class constructors


At first sight, using imports a specific function (such as using std::cout to the scope). But this using imports all the base class constructors to the derived class.

template< typename T >
class Vec : public std::vector< T >
{
public:
    using std::vector<T>::vector;  // ???

    //...
};

What's actually behind the scenes of this `using` declaration?

Solution

  • As it's public inherited, supposedly all the base class constructors should have been available already (ie why need using)?

    No, constructors of the base class are not inherited by default. A detailed explanation can be found in the following discussions:


    What's actually behind the scene of this using declaration?

    From cppreference.com, using does

    1. Using-declarations can be used to introduce namespace members into other namespaces and block scopes, or to introduce base class members into derived class definitions.
    2. [...] ( specific...)

    Also while inheritance:

    If the using-declaration refers to a constructor of a direct base of the class being defined (e.g. using Base::Base;), all constructors of that base (ignoring member access) are made visible to overload resolution when initializing the derived class.