c++中的私有类型定义和SFINAE



我试图用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());
}

现场演示

最新更新