【发布时间】:2017-01-18 07:54:44
【问题描述】:
在attempt to answer another question 中,我想出了一个方案来强制 CRTP 基类的子类在其构造函数中接受特定类型作为参数:使参数类型的构造函数private,将 CRTP 基类分配为friend,并将参数类型声明为基类构造函数的参数。
然而,当我试图证明这个方案通过访问冲突提供了所需的保护时,我发现即使参数类型的构造函数是私有的,子类也能够构造它:
template <typename T>
class SingletonBase {
protected: class P { friend class SingletonBase<T>; P() = default; };
public:
SingletonBase(P) {}
};
class Logger: public SingletonBase<Logger> {
using BASE = SingletonBase<Logger>;
public:
Logger() : BASE{P{}} {} // WHY NO ACCESS VIOLATION?
};
这个compiles without error,尽管我预计会发生访问冲突。为什么?
【问题讨论】:
标签: c++ inheritance private friend crtp