SFINAE未检测到T :: reference

时间:2011-04-30 01:40:59

标签: c++ stl sfinae

std::vector<T>类是STL Container概念的模型,因此vector的任何正确实现都必须包含嵌套的typedef value_type以及reference。这应该可以使用SFINAE检测到。但是,在我自己的测试中,我可以使用SFINAE来检测嵌套的value_type typedef,但由于某种原因,我无法检测reference

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>());
}

输出:Has nested 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: no matching function for call to test(std::vector<int, std::allocator<int> >)

为什么SFINAE技术适用于T::value_type但不适用于T::reference

2 个答案:

答案 0 :(得分:5)

什么是引用的指针?

A :不可能。引用的指针不可存在,因此您的任何函数都不存在。这与您的第一种情况形成对比,其中至少有一种功能可以存在(因此您可以获得编译,链接和输出)。

有趣的是,SFINAE 在这里工作,因为函数定义不会导致编译错误。它试图调用一个函数,因为不可能+ SFINAE,不存在,导致错误。 :)

答案 1 :(得分:2)

  

typename T :: reference * test(T)

引用的引用在C ++中是非法的。

标准中的§8.3.2/ 4表示:

  

不得引用引用,不引用引用数组,不引用引用