gpt4 book ai didi

c++ - 引用崩溃?

转载 作者:IT老高 更新时间:2023-10-28 22:12:24 26 4
gpt4 key购买 nike

通过尝试解决this problem ,有些事情让我感到奇怪。考虑以下代码:

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

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

这似乎也被称为 reference collapsing,但我以前从未听说过这个术语(请参阅链接问题中的评论)。

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

最佳答案

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

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

这经常会给使用非常严格或更旧的 C++03 编译器(GCC4.1 和 Comeau 8/4/03 不喜欢上述)的人造成问题,因为标准函数对象绑定(bind)器不处理“引用到引用”的情况,偶尔会创建这样的非法类型。

在 C++0x 中,这称为“引用折叠”,是的。大多数当前的 C++03 编译器通过追溯应用规则来做到这一点(即 T& 其中 T 表示引用类型再次是 T) . boost.call_traits库使声明此类函数参数变得容易,因此不会发生“引用引用”的情况。

请注意那里的 const 没有任何作用。应用于引用类型的 const 会被静默忽略。所以即使编译器支持引用折叠,下面的也是不合法的

int const x = 0;

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

关于c++ - 引用崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3771208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com