gpt4 book ai didi

c++ - 引用类型转换

转载 作者:搜寻专家 更新时间:2023-10-31 00:59:05 25 4
gpt4 key购买 nike

我发现 const 引用有一种意想不到的行为:

#include <iostream>

using namespace std;

template <typename T>
void myfunction() {
T b = 30;
const int &i = b;
cout << "Before change: " << i << endl;
b = 33;
cout << "After change: " << i << endl;
}

int main() {
cout << "int" << endl;
myfunction<int>();
cout << endl;
cout << "double" << endl;
myfunction<double>();
}

结果如下:

int
Before change: 30
After change: 33

double
Before change: 30
After change: 30

我理解在第二种情况下,&i 没有引用 b 因为它是一个 double 对象,但确实引用了一个临时对象。这也是为什么改变 b 时 i 的值没有改变的原因。

但为什么这样的行为甚至被允许呢?在我看来,这是违反直觉的。仅使用 const int i = b 是否有任何性能优势?

最佳答案

通常可以想到

const int &i = b;

作为

int const* const p_i = &b;

自动取消引用,比如(但不要太字面意思!)

#define i (*p_i)

那里的第一个 const 表示您不能通过指针/引用更改 b。但是您可以通过其他方式更改它。然后你通过看到的指针/引用被改变了。

bdouble 类型的情况下,引用不能直接引用它。然后你得到的是一个 temporary int,从 double 转换而来,它的生命周期延长到引用(和指针 View )的生命周期事情有点崩溃了!)。在这种情况下,对原始文件所做的更改不会反射(reflect)在引用所指的临时文件中。


顺便说一句,这种别名(两种或多种方式来引用同一事物,具有不同的限制)是通过引用传递给 const 的原则问题。令人高兴的是,这在实践中并不是什么大问题。事实上,除了创建愚蠢的示例来教授技术可能性时,我从未遇到过它。


关于

But why is such a behavior even allowed?

…这涉及两个问题:

  • 绑定(bind)到引用时临时的生命周期延长。

  • doubleint 的隐式转换。

当我问 Bjarne 关于延长生命周期的理由时,在过去每个人(包括 Bjarne)都使用 comp.lang.c++ Usenet 组的时候,他回答说这主要是为了规则的一致性。

doubleint 以及通常从任何内置数值类型到另一种数值类型的潜在且通常会破坏信息的隐式转换是否来自旧 C天。在 C++11 及更高版本中,您可以使用大括号初始化器来限制允许的转换。因此,如果你写

const int &i = {b};

... 那么对于 b 类型为 double 的情况,代码将无法编译,因为那将是一个缩小转换 .

当然这对例如键入 short(不再是缩小转换)没有帮助,但它有一点帮助。

关于c++ - 引用类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178350/

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