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