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;