SFINAE 未检测到 T::reference
std::vector
类是 STL 容器概念的模型,因此任何正确的向量实现都必须包含嵌套的 typedef value_type
以及参考
。这应该可以使用 SFINAE 检测到。不过,在我自己的测试中,我可以使用 SFINAE 来检测嵌套的 value_type
typedef,但由于某种原因,我无法检测引用
。
template <class T>
typename T::value_type* test(T)
{
cout << "Has nested typedef!" << endl;
}
template <class T>
void test(...)
{
cout << "Doesn't have nested typedef!" << endl;
}
int main()
{
test(std::vector<int>());
}
输出: Hasnested typedef!
但是,如果我将 value_type
替换为 reference
,例如:
template <class T>
typename T::reference* test(T)
{
cout << "Has nested typedef!" << endl;
}
template <class T>
void test(...)
{
cout << "Doesn't have nested typedef!" << endl;
}
int main()
{
test(std::vector<int>());
}
...程序根本无法编译,给出错误: error: nomatching function for call to test(std::vector
为什么 SFINAE 技术适用于 T: :value_type
但不与 T::reference
一起使用?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
什么是指向引用的指针?
A:不可能。指向引用的指针不能存在,因此您的两个函数都不能存在。这与您的第一种情况相反,在第一种情况下,至少有一个函数可以存在(因此您可以获得编译、链接和输出)。
有趣的是,SFINAE 在这里工作,因为函数定义不会导致编译错误。它试图调用一个因不可能+SFINAE 而不存在的函数,这会导致错误。 :)
What's a pointer to a reference?
A: Impossible. Pointers to references cannot exist, so neither of your functions can exist. This is in contrast to your first case, where at least one of the functions can exist (and thus you get compilation, linkage and output).
Interestingly, SFINAE is working here, as the function definition is not causing the compilation error. It's attempting to call a function that, because of impossibility+SFINAE, doesn't exist, that's causing the error. :)
指向引用的指针在 C++ 中是非法的。
标准§8.3.2/4 说:
Pointers to references are illegal in C++.
§8.3.2/4 from the Standard says: