参考崩溃?

Ale*_* C. 17 c++

通过尝试解决这个问题,有些事让我感到奇怪.请考虑以下代码:

template <typename T>
struct foo 
{
    foo(T const& x) : data(x) {}
    T data;
};
Run Code Online (Sandbox Code Playgroud)

似乎我可以构造一个foo<T const&>没有错误的类型的对象,假设T const& const&被理解为T const&.

这似乎也被称为参考崩溃,但我之前从未听过这个术语(参见链接问题中的评论).

这是普遍的吗?这是标准吗?

Joh*_*itb 20

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

typedef int &ref;
ref &r = ...; // reference to reference!
Run Code Online (Sandbox Code Playgroud)

对于使用真正严格或较旧的C++ 03编译器(GCC4.1以及Comeau 8/4/03不喜欢上述内容)编译的人来说,这经常会导致问题,因为标准函数对象绑定器不会处理"引用"引用"情况,偶尔创造这种非法类型.

在C++ 0x中,这称为"引用崩溃",是的.大多数当前的C++ 03编译器通过追溯应用规则来做到这一点(即,T&where T表示引用类型T).该boost.call_traits库可以很容易地虽然声明这样的函数的参数,使"参考参考"的情况不会发生.

请注意,const那里没有任何影响.甲const施加在引用类型被自动忽略.因此,即使编译器支持引用折叠,以下内容也是不合法的

int const x = 0;

// illegal: trying to bind "int&" to "int const"!
ref const& r = x; 
Run Code Online (Sandbox Code Playgroud)


Ste*_*end 5

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

在C++ 98中,只有一个参考折叠规则:T &&或对引用的引用,折叠为T&:

void g(int & ri) {++ri;} // int& & -> int& 
void f(int & ri) {g(ri);}
Run Code Online (Sandbox Code Playgroud)

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

int ben;
int& bill(ben);     // OK
int & & bob(bill);  // error C2529: 'bob' : reference to reference is illegal
Run Code Online (Sandbox Code Playgroud)

  • C++ 03中没有引用崩溃.该文章的作者被误导了.使用引用名称的identity-expression类型不是引用类型.*No*表达式具有引用类型.表达式具有值类别,用于决定它们如何绑定到引用. (2认同)
  • 您删除的链接不是我在第一条评论中提到的链接。这个例子是错误的;函数调用 `g( ri )` 不涉及任何类型的折叠。 (2认同)