gpt4 book ai didi

c++ - 什么是 C++ 临时对象?

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

我正在阅读 Eckel 中的常量章节,并在解释临时变量的部分混淆了。我能得到的是,当我们将引用传递给函数时,编译器会创建一个临时对象,它是一个 const 对象,因此即使我们将引用传递为

f(int &a){}

现在我试图在网上查看其他一些关于 Temporaries 的引用资料,但被卡住了

http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr382.htm

Are all temporaries rvalues in C++?

这提示我,临时对象不仅仅是在函数内部传递引用和为其创建 const 对象。现在我可以从这两个链接中得到一些东西,但不能说我已经理解临时对象的工作、功能和使用所有的。如果有人可以解释临时对象的概念,那将非常有帮助。在此先感谢。
bruce eckel 的原始示例是:

// 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());
} ///:~

最佳答案

一个临时对象是一个未命名的对象(一些结果表达式),并且始终是右值。或者也许应该更好的说法是产生右值的表达式是一个临时的。

在 C 中,右值/临时值并不是真正的对象(在某种意义上该标准使用“对象”一词:位于某处的东西在内存中)。因此,例如,他们不符合简历要求(像 3 + 5 这样的表达式的类型是 int,而不是 int const,和 cv 限定符在函数返回值上被忽略)并且你不能获取他们的地址(因为他们不在内存中,他们没有地址)。在 C++ 中,问题因类而变得模糊类型:您可以在右值上调用成员函数,并且成员函数将有一个 this 指针,这意味着即使是右值(类类型)也必须在内存中有一个地址,并且cv-qualifications 有意义,因为如果返回类型是const,您不能在其上调用非常量函数。

最后虽然rvalue和temporary的概念是非常密切相关,C++ 标准使用中的词略有不同的方式。表达式的结果是右值或左值(C++11 增加了其他可能性,但你可以忽略它们,直到你成为专家),这区分涉及所有类型。当 C++ 标准谈到一个临时的,它是一个右值,它是(或已经成为)一个对象。大多数情况下,它们具有类类型;很少你会有一个不是类的临时文件的情况输入写得很好的代码,除了模板是涉及。区别很重要,因为即使内置 & 运算符在类的右值、右值上是非法的类型有一个定义的“生命周期”和一个内存地址。那lifetime 是直到完整表达式结束。所以类的时候就类型而言,临时和命名值主要是临时没有名字,它有不同的生命周期。类类型的生命周期之所以重要,有两个原因:首先,它决定了何时调用析构函数,其次,如果对象“泄漏”指向内部数据的指针,例如像 std::string::c_str(),它确定该指针可能有效多长时间。

最后,我提到了模板,因为那几乎是唯一一次您将拥有对非类类型的 const 引用。通常in arguments 的约定是按非类的值传递类型,并通过类类型的 const 引用;的作者然而,模板并不知道 T 是否是一个类类型与否,在大多数情况下,将定义他的功能取一个 T const&。实际上,这将是唯一的时间你会得到一个非类类型的临时对象(如果模板保存了参数的地址,你可以有问题)。

关于c++ - 什么是 C++ 临时对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15130338/

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