C++ 引用崩溃?

C++ 引用崩溃?,c++,C++,通过尝试解决问题,我感到奇怪。考虑下面的代码: template <typename T> struct foo { foo(T const& x) : data(x) {} T data; }; 模板 结构foo { foo(T常数&x):数据(x){} T数据; }; 似乎我可以毫无错误地构造foo类型的对象,假设的T const&const&被理解为T const& 这似乎也被称为引用崩溃,但我以前从未听说过这个术语(参见链接问题中的注释) 这是普

通过尝试解决问题,我感到奇怪。考虑下面的代码:

template <typename T>
struct foo 
{
    foo(T const& x) : data(x) {}
    T data;
};
模板
结构foo
{
foo(T常数&x):数据(x){}
T数据;
};
似乎我可以毫无错误地构造
foo
类型的对象,假设的
T const&const&
被理解为
T const&

这似乎也被称为引用崩溃,但我以前从未听说过这个术语(参见链接问题中的注释)

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

根据,在C++98中,对引用折叠的支持非常有限:

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

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

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

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

typedef int &ref;
ref &r = ...; // reference to reference!
这经常会给使用真正严格的或较旧的C++03编译器(GCC4.1以及Comeau 8/4/03不喜欢上述编译器)进行编译的人带来问题,因为标准函数对象绑定器不考虑“引用到引用”的情况,偶尔会创建这样的非法类型

在C++0x中,这称为“引用折叠”,是的。大多数当前的C++03编译器都是这样做的(即
T&
其中
T
再次表示引用类型是
T
),方法是追溯应用规则。不过,该库使声明此类函数参数变得很容易,因此不会出现“引用到引用”的情况

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

int const x = 0;

// illegal: trying to bind "int&" to "int const"!
ref const& r = x; 

+1.我有一些家庭作业要做,thxI想把这个类似的问题联系起来:太好了,我发现这可以通过traits类来解决,但我从来没有在STL的[我的]实现中看到过这样的事情。那不应该是“即
t&
其中
t
表示引用类型是
t&
”“弗雷德,那将是自我递归的。我的意思是,如果
T
U&
,你说
T&
,结果类型是
T
——即
U&
。当然,这与右值引用不兼容。我需要说“即
T&
,其中
T
表示类型
U&-&&
或-&&表示类型
U&
”,对于右值引用是正确的。在C++03中没有折叠的引用。那篇文章的作者被误导了。使用引用名称的标识表达式的类型不是引用类型。没有表达式具有引用类型。表达式有值类别,它们决定如何绑定到引用。@Potatoswatter-谢谢,现在还有更好的引用。我将删除此部分。谢谢……但是,嗯,这个链接不是我之前使用的链接。@potatosatter-我删除了一个指向MSDN的链接,该链接引用了C++03。您删除的链接不是我在第一条评论中提到的链接。这个例子是错误的;函数调用
g(ri)
不涉及任何类型的折叠。
int const x = 0;

// illegal: trying to bind "int&" to "int const"!
ref const& r = x;