【问题标题】:What does T& mean for some template argument T? [duplicate]对于某些模板参数 T,T& 是什么意思? [复制]
【发布时间】:2014-12-08 19:58:11
【问题描述】:

例如

template<class T>
struct Ref
{
    using type = T&;
};

对于所有可能的模板参数,Ref&lt;T&gt;::type 是否与 std::add_lvalue_reference&lt;T&gt;::type 相同?例如。 intint&amp;int&amp;&amp;?

我刚刚阅读了std::add_lvalue_reference&lt;T&gt; 的源代码。很确定它们是等价的。
如果是,我们可以通过简单地写 T&amp; 来节省一些空间。

【问题讨论】:

  • @cdhowie 哇,甚至不知道这个问题。答案似乎有些相似……

标签: c++ templates c++11 reference typetraits


【解决方案1】:

[meta.trans.ref] 中的表 53 - add_lvalue_reference 的定义:

如果T 命名一个对象或函数类型,那么成员 typedef type 应命名为T&amp;;否则,如果T 将类型命名为“rvalue reference to T1” 那么成员 typedef 类型应命名为 T1&amp;;否则,键入 应命名为T

现在回忆一下引用折叠的规则:

如果 [...] 一个类型 template-parameter (14.3.1) [...] 表示一个类型 TR 是对 T 类型的引用,尝试创建类型“左值” 对 cv TR 的引用创建类型“对 T 的左值引用” […]

所以答案是肯定的:

  • 对于对象或函数,条件很容易满足。只是T&amp;,不涉及引用折叠。

  • 对于右值引用,将创建对所引用类型T1 的左值引用。

  • 对于左值引用,保留准确的引用类型。

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2021-11-16
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多