gpt4 book ai didi

c++ - 临时对象——它们是什么时候创建的,你如何在代码中识别它们?

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

在 Eckel,第 1 卷,第 367 页

//: C08:ConstReturnValues.cpp
// Constant return by value
// Result cannot be used as an lvalue
class X {
int i;
public:
X(int ii = 0);
void modify();
};

X::X(int ii) { i = ii; }

void X::modify() { i++; }

X f5() {
return X();
}

const X f6() {
return X();
}

void f7(X& x) { // Pass by non-const reference
x.modify();
}

int main() {
f5() = X(1); // OK -- non-const return value
f5().modify(); // OK
// Causes compile-time errors:
//! f7(f5());
//! f6() = X(1);
//! f6().modify();
//! f7(f6());
} ///:~

为什么 f5() = X(1) 成功了?这是怎么回事???

第一季度。当他执行 X(1) 时 - 这里发生了什么?这是一个构造函数调用 -这不应该然后阅读 X::X(1); 是类实例化 - 不是类实例化类似:X a(1); 编译器如何确定什么X(1) 是??我的意思是.. 名称装饰发生所以.. X(1) 构造函数call 将转换为: globalScope_X_int 作为函数名字..???

第二季度。肯定会使用一个临时对象来存储 X(1) 的结果对象创建然后将其分配给对象 f5() 返回(这也将是一个临时对象)?鉴于 f5() 返回一个临时即将被丢弃的对象,他如何分配一个常量临时到另一个常数临时???有人可以清楚地解释为什么:f7(f5()); 应该产生一个常量临时而不是普通的旧 f5();

最佳答案

您的所有问题都归结为 C++ 中的一条规则,即临时对象(没有名称的对象)不能绑定(bind)到非常量引用。 (因为 Stroustrup 觉得这可能会引发逻辑错误……)

一个问题是你可以在一个临时对象上调用一个方法:所以 X(1).modify() 很好,但是 f7(X(1)) 不是。

至于创建临时的位置,这是编译器的工作。该语言的规则明确规定,临时对象只能存活到当前完整表达式结束(并且不再),这对于析构函数具有副作用的类的临时实例很重要。

因此,下面的语句X(1).modify();可以完全翻译为:

{
X __0(1);
__0.modify();
} // automatic cleanup of __0

考虑到这一点,我们可以攻击 f5() = X(1);。我们这里有两个临时工,还有一个任务。在调用赋值之前,赋值的两个参数都必须被完全评估,但顺序并不精确。一种可能的翻译是:

{
X __0(f5());
X __1(1);
__0.operator=(__1);
}

(另一个翻译是交换__0__1的初始化顺序)

它起作用的关键是 __0.operator=(__1) 是一个方法调用,可以在临时对象上调用方法:)

关于c++ - 临时对象——它们是什么时候创建的,你如何在代码中识别它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10897799/

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