void foo中的通用引用(T <u>&amp;&amp; param)</u>

时间:2015-02-19 11:51:48

标签: c++ c++11 rvalue-reference forwarding-reference

在模板模板参数的情况下,是否可以使void foo采用通用引用而不是右值引用,如下面的代码所示?

#include <iostream>
#include <string>
using namespace std;

template <int I>
struct s
{
    string str;
};

template <template<int> class T, int U>
void foo(T<U>&& param)
{
    cout << param.str << endl;
}

int main()
{
    s<5> thing;
    foo( thing );
}

我得到following error

error: cannot bind 's<5>' lvalue to 's<5>&&'

1 个答案:

答案 0 :(得分:2)

不,通用引用依赖于推导为左值引用的模板参数。 T中的T<U>&&不能是左值参考,因此无效。

可以使用T&&,并使用SFINAE要求它匹配某些T<U>

template <template<int> class T, int U>
void foo_helper(const volatile T<U>&);

template <template<int> class T, int U>
void foo_helper(const volatile T<U>&&);

template <typename T, typename = decltype(foo_helper(std::declval<T>()))>
void foo(T&& param)
{
  cout << param.str << endl;
}

如果需要,如果foo意图直接使用TU,您还可以提供帮助类型特征。