gpt4 book ai didi

c++ - const 引用临时异常

转载 作者:可可西里 更新时间:2023-11-01 17:06:11 24 4
gpt4 key购买 nike

我们都知道像这样的事情在c++中是有效的:

const T &x = T();

同时:

T &x = T();

不是。

a recent question谈话导致这条规则。 OP 发布了一些明显让人联想到 UB 的代码。但我希望它的修改版本可以工作(这是修改版本):

#include <iostream>
using namespace std;

class A {
public:
A(int k) { _k = k; };
int get() const { return _k; };
int _k;
};

class B {
public:
B(const A& a) : _a(a) {}
void b() { cout << _a.get(); }
const A& _a;
};

B* f() {
return new B(A(10));
}

int main() {
f()->b();
}

这在一些机器上打印垃圾,在其他机器上打印 10... 对我来说听起来像 UB :-)。但后来我想,好吧 A 基本上是一个美化的 int 它所做的一切都是初始化一个并读取它。为什么不直接调用 A 一个 int 看看会发生什么:

#include <iostream>
using namespace std;

typedef int A;

class B {
public:
B(const A& a) : _a(a) {}
void b() { cout << _a; }
const A& _a;
};

B* f() {
return new B(A(10));
}

int main() {
f()->b();
}

它每次都打印10。至少似乎 const 引用规则对int 版本有效,但对类版本无效。由于使用堆,它们都是简单的 UB 吗?我是否幸运地使用了 int 版本,因为编译查看了所有 const 并直接打印出 10?我缺少规则的哪一方面?

最佳答案

它只是说明通过“在编译器中尝试”来分析语言行为通常不会产生任何有用的结果。出于同样的原因,您的两个示例均无效。

仅当您将临时对象用作 const 引用的直接初始值设定项时,临时对象的生命周期才会延长 - 只有这样才能在引用和临时对象之间建立“生命周期”链接。

尝试将临时对象作为构造函数的参数传递并在构造函数中附加常量引用不会建立上述链接,也不会延长临时对象的生命周期。

另外,按照C++标准,如果你这样做

struct S {
const int &r;

S() : r(5) {
cout << r; // OK
}
};

临时对象的生命周期只延长到构造函数的末尾。一旦构造函数完成,临时就死了,这意味着这个

S s;
cout << s.r; // Invalid

无效。

您对 int 的实验只是“似乎有效”,纯属偶然。

关于c++ - const 引用临时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3097806/

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