代码之家  ›  专栏  ›  技术社区  ›  Alexandre C.

引用崩溃?

c++
  •  16
  • Alexandre C.  · 技术社区  · 14 年前

    通过尝试解决 this problem ,有些事情让我想知道。考虑以下代码:

    template <typename T>
    struct foo 
    {
        foo(T const& x) : data(x) {}
        T data;
    };
    

    foo<T const&> 没有错误,假设 T const& const& 被理解为 T const&

    似乎这也叫做 参考折叠 ,但我以前从未听说过这个词(见链接问题中的评论)。

    这种情况普遍吗?这是标准吗?

    2 回复  |  直到 7 年前
        1
  •  20
  •   Johannes Schaub - litb    14 年前

    在C++ 03中,执行下列操作是不合法的

    typedef int &ref;
    ref &r = ...; // reference to reference!
    

    在C++ 0x中,这被称为“引用折叠”,是的。大多数当前C++ 03编译器都是这样做的(即A T& 哪里 T 表示引用类型为 T型 boost.call_traits 库使得声明这样的函数参数变得很容易,这样就不会出现“引用到引用”的情况。

    请注意 const 应用于引用类型的将被静默忽略。因此,即使编译器支持引用折叠,以下内容也是不合法的

    int const x = 0;
    
    // illegal: trying to bind "int&" to "int const"!
    ref const& r = x; 
    
        2
  •  5
  •   Steve Townsend    11 年前

    根据 this 在C++ 98中,参考折叠的支持有限:

    折叠规则:T&or引用 对于引用,折叠到T&处:

    void g(int & ri) {++ri;} // int& & -> int& 
    void f(int & ri) {g(ri);}
    

    即使在那里,试图声明一个引用到引用的变量也是非法的:

    int ben;
    int& bill(ben);     // OK
    int & & bob(bill);  // error C2529: 'bob' : reference to reference is illegal