【发布时间】:2017-01-11 05:38:40
【问题描述】:
在模板的上下文中,应用了以下“引用折叠”规则:
template <typename T>
void foo(T && t)
{
//T& & -> T&
//T& && -> T&
//T&& & -> T&
//T&& && -> T&&
}
为什么该语言禁止“通用引用”使用const 限定符?
template <typename T>
void foo(T const && t)
如果类型已解析为引用(4 个案例中的 3 个),这似乎是有意义的。
我确信这个想法与该语言的其他一些设计方面不兼容,但我无法看到完整的画面。
【问题讨论】:
-
你为什么不直接使用
const T&? -
我怀疑
const&&与const&没有什么不同。临时变量(r 值)已经可以绑定到const&那么const&&可以添加什么? -
AFAIK,这已经发生在参考文献中;如果您的
T是U const &,则T &&将折叠为U const &。术语“通用引用”确实意味着 通用 引用:您无需在其中指定const即可获得常量引用。 -
可能是因为移动意味着源对象的某种“破坏”(即作为
T&&传递的),您不能破坏任何 const 对象。 -
顺便说一句,我不确定它如何与参考折叠交互,但
const T&&is actually legal, and the standard library even makes use of it。
标签: c++ templates constants move-semantics forwarding-reference