C++ 中的私有 typedef 和 SFINAE

Private typedef and SFINAE in C++

我试图通过 SFINAE 获得直觉,显然它应该检测私有访问违规。

但是,下面的代码不能用我的 clang++ 10.0.0-4ubuntu1 编译。

class K{
    typedef void type;
};

template<typename T>
K::type f(T t) {}
void f(...) {}

    
int main() {
    f(K()); //error: 'x' is a private member of 'K'
}

为什么 SFINAE 不是这种情况?

K::type 不依赖于任何模板参数,因此 SFINAE 不适用。

如果您改为使用从属名称,SFINAE 将启动,并且将选择 f 的第二个重载。例如:

class K{
    typedef void type;
};

template<typename T>
typename T::type f(T t) {}
void f(...) {}

    
int main() {
    f(K());
}

Live Demo