变量的恒定性及其生存期
The constness of a variable and its lifetime
所以从另一个线程中提出的一个问题中,我想到了一个新问题,答案对我来说并不明显。
因此,似乎有一个 c++ 规则说,如果你有一个对临时的常量引用,那么临时的生存期至少与常量引用一样长。但是,如果你有一个对另一个对象的成员变量的局部 const 引用,然后当你离开范围时 - 它是否调用该变量的析构函数?
所以这里是从原始问题修改的程序:
#include <iostream>
#include <string>
using namespace std;
class A {
public:
A(std::string l) { k = l; };
std::string get() const { return k; };
std::string k;
};
class B {
public:
B(A a) : a(a) {}
void b() { cout << a.get(); } //Has a member function
A a;
};
void f(const A& a)
{ //Gets a reference to the member function creates a const reference
stores it and goes out of scope
const A& temp = a;
cout << "Within f(): " << temp.k << "n";
}
int main() {
B b(A("hey"));
cout << "Before f(): " << b.a<< "n";
f(b.a);
cout << "After f(): " << b.a.k << "n";
return 0;
}
因此,当我运行此代码时,每次都会得到"hey"作为值。这似乎意味着局部 const 引用不会在整个生命中与传递的成员对象绑定自身。为什么不呢?
b.a
不是临时的,因此其生存期不受随后绑定到它的任何引用的影响。
我不确定我是否理解你在问什么。 在您的代码中,唯一的临时我看到的是初始化b
的表达式中的A("hey")
在main
. 并将其(使用复制构造函数)复制到b.a
在B::B
. 在那之后,任何地方都没有更多的临时人员。
更一般地说,临时绑定到引用的事实不一定会改变其生存期。 延长使用寿命的是临时用于初始化引用的事实:在您的例如,temp
f
永远不会对临时的生存期,因为它不是用临时初始化的,但有另一个参考。 这条规则也有例外:如果使用临时初始化初始值设定项中的成员引用一个类,它的生命周期仍然不会超过结束构造函数,因此:
class A
{
std::string const& rString;
public:
A() : rString( std::string( "hey" ) ) {}
std::string get() const { retur rString; }
};
行不通。
相关文章:
- GCC对可能有效的代码抛出init list生存期警告
- 在不复制临时对象的情况下延长其生存期
- 结束另一个线程中使用的对象的生存期
- "this"指针的值在对象的生存期内是否恒定?
- 创建具有全局生存期的 UObject
- C++17 和静态临时生存期的参考扩展
- 指针类型类成员的动态强制转换的恒定性是什么?
- 数组对象的生存期是否在重用其元素存储时结束?
- 共享指针生存期
- 具有空洞初始化的对象的生存期
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 指针引用的生存期(以 C++为单位)
- 为什么对引用的常量引用会失去其恒定性?
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 运算符的要求<恒定性在标准::stable_sort
- 全局静态生存期?他们会让你的程序崩溃吗?
- 变量的恒定性及其生存期