【问题标题】:universal reference for template type error模板类型错误的通用参考
【发布时间】:2016-11-02 18:54:16
【问题描述】:

请原谅这个糟糕的标题...

所以,通常在这样的函数中:

template <class T>
void f(T&& i){
}

T&amp;&amp; 是通用引用。在这样的上下文中,它是一个右值引用:

template <class T>
struct s{

    void f(T&& t){}

};

这是有道理的,因为T 是相对于s 的固定类型,其中f() 是一个方法。

但是,显然在这种情况下:

template <class T, unsigned n>
std::array<T, n>
f(T&&){
}

T&amp;&amp; 也是一个右值引用。但是,这种情况与上述情况不同。那么,T&amp;&amp; 在这里也是右值引用而不是通用引用的原因是什么?

【问题讨论】:

  • 你能改写一下吗?我不明白你在说什么。
  • 你为什么说T&amp;&amp;在这种情况下是一个右值引用?

标签: c++ rvalue universal-reference


【解决方案1】:

那是因为您明确提供了参数类型(我假设这么多,但这是使您的示例编译的唯一方法)。

f&lt;int,5&gt;根本不进行类型推导,其参数为int&amp;&amp;。没有参考崩溃发生。

您可以通过编写f 模板来解决此问题:

template<unsigned n, typename T>
array<decay_t<T>, n>
f(T&& t);

现在,t 是一个转发/通用引用如果您没有明确提供第二个模板参数

【讨论】:

  • 我明白了,是的,我明确提供了它。谢谢。将查找衰减函数。
  • @lotolmencre decay_t 是为了确保您不会以T&amp; 结束,这对于std::array 来说是不合法的类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多