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