C++初学者的一点疑惑

在阅读cparse的源码时候遇到的一点困惑,代码如下
//Container为一个模板类
template <typename T>
class Container {
 protected:
  std::shared_ptr<T> ref;

 public:
  Container() : ref(std::make_shared<T>()) {}
  Container(const T& t) : ref(std::make_shared<T>(t)) {}
}

//TokenMap继承自Container,模板参数为MapData_t
struct TokenMap : public Container<MapData_t>, public Iterable {
  TokenMap(const TokenMap& other) : Container(other) {
    this->type = MAP;
  }
}

//MapData_t的定义
struct MapData_t {
  TokenMap_t map;
  TokenMap* parent;
  MapData_t();
  MapData_t(TokenMap* p);
  MapData_t(const MapData_t& other);
  ~MapData_t();

  MapData_t& operator=(const MapData_t& other);
};
可以看到,TokenMap有一个构造函数TokenMap(const TokenMap& other)接收一个TokenMap引用类型,其构造过程中调用了父类Container的构造函数,并将TokenMap&传给了父类。以我的理解,Container并没有一个接收TokenMap&的构造函数,其构造函数需要接收一个MapData_t&类型,那么此代码是如何通过编译的?背后的原理是什么?

MapData_t 有一个构造函数MapData_t(TokenMap* p);通过这个构造函数会把TokenMap类型隐式转换为MapData_t 类型,从而通过编译