【问题标题】:Difference between int&& and template<class T> T&& [duplicate]int&& 和 template<class T> T&& 之间的区别
【发布时间】:2014-09-15 12:43:03
【问题描述】:
#include <iostream>
#include <typeinfo>

struct C
{
  template<class T>
  C(T && t) { std::cout << typeid(T).name() << std::endl; }
};

struct D
{
  D(int && t) { }
};

int main() 
{
    int i = 1;
    std::cout << typeid(i).name() << std::endl;

    C c(i);     // OK
    D d(i);     // error
}

D d(i); 行编译失败:

foo.cc:22:7: error: cannot bind 'int' lvalue to 'int&&'

但是,将其注释掉,生成的输出是:

i
i

这表明T 被推断为intD(int &amp;&amp;)怎么绑定失败,C(int &amp;&amp;)绑定成功?

【问题讨论】:

  • 扣除的工作方式不同,T 变为 int&amp;this 有帮助吗?
  • @MattMcNabb 查找参考折叠。
  • @MattMcNabb 我认为在我链接的 Q/A 的答案中对此进行了解释。我实际上很想将其作为重复项关闭...
  • @MattMcNabb 不,我认为他在说的是U 不是推导出为X&amp;&amp;,而是推导出为X,并且参数类型中的&amp;&amp; 被添加到.
  • @MattMcNabb 可能是因为通用引用主要用于完美的转发场景,在这种场景中,您将函数的参数转发到它们的目的地,同时保持参数的值类别,因为它被传递给您的函数。您不能移出 const&amp;&amp; 参数,它必须被复制。因此,在这种情况下,完美转发将不适用。这是一个猜测,我不知道这是否是其背后的全部原因,或者为什么通用引用的定义如此狭窄。

标签: c++ templates c++11


【解决方案1】:

根据 cmets 中提供的所有重要信息回答我自己的问题:

  • int &amp;&amp; 只能绑定到右值
  • T&amp;&amp; 可以绑定到右值和左值

标准没有“可以绑定到右值和左值”的特定术语,因此 Scott Meyers 创造了术语通用参考this article by him 解释了一切。

理由:非通用版本用于move语义,但perfect forwarding需要通用版本。

在 C++11 的开发过程中,一些人认为应该使用不同的语法来进行移动而不是转发,但是他们输了,&amp;&amp; 用于两者,T&amp;&amp; 在推断的上下文中表示 转发,而&amp;&amp; 在其他情况下表示移动

Info taken from this post 乔纳森·韦克利;事实上,我的问题可以作为该问题的副本结束。

另外,T const &amp;&amp; 不是通用引用,可能是因为它对转发没有用处。

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多