通过尝试解决这个问题,有些事让我感到奇怪.请考虑以下代码:
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)
根据此,在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)
| 归档时间: |
|
| 查看次数: |
4457 次 |
| 最近记录: |