我们都知道这样的事情在c ++中是有效的:
const T &x = T();
Run Code Online (Sandbox Code Playgroud)
而:
T &x = T();
Run Code Online (Sandbox Code Playgroud)
不是.
在最近的一个问题中,谈话导致了这一规则.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();
}
Run Code Online (Sandbox Code Playgroud)
这会在某些机器上打印垃圾,在其他机器上打印10个......对我来说听起来像UB :-).但后来我想,A …
有一件事我从未理解过参考文献,我希望有人可以帮助我.据我所知,引用不能为空.但是如果你有一个函数foo()返回对堆栈对象的引用会发生什么:
Object & foo(){
Object o;
return o;
}
Object & ref = foo();
Run Code Online (Sandbox Code Playgroud)
理论引用将引用一个不存在的对象,因为一旦函数返回,o就会超出范围.这里发生了什么事?
所以从另一个帖子中提出的问题来看,我已经想到了一个新问题,答案对我来说并不明显.
所以看来有一个c ++规则说如果你有一个临时的const引用,那么临时的生命周期至少和const引用一样长.但是,如果你有一个本地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 …Run Code Online (Sandbox Code Playgroud) 这个问题涉及函数堆栈和引用成员(我读到的一般认为是不好的做法).我的测试代码:
#include <iostream>
using namespace std;
struct Person
{
Person(const int& s) : score(s) {}
const int& score;
};
int main()
{
Person p(123);
cout << "P's score is: " << p.score << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们在Person的构造函数中创建一个整数对象.创建模板对象是因为将int转换为&int(这就是我们需要const的原因).然后我们将得分点设置为构造函数的参数.最后,我们退出构造函数并销毁参数.
输出:
P's score is: 123
Run Code Online (Sandbox Code Playgroud)
如果争论被破坏,我们怎么还能获得价值123呢?如果我们将参数复制给成员,那对我来说是有意义的.我的逻辑告诉我,成员会指向一个空位,这显然是不正确的.也许这个论点并没有真正被破坏,而是只是超出了范围?
当我读到这个问题时出现了这个问题:const引用是否延长了临时生命?
我发现Squirrelsama的答案很明确,我认为我理解它直到我尝试了这段代码.
更新2/12/2018: 有关此内容的更多信息: 当C++引用离开它的范围时会发生什么?
更新2/18/2018: 这个问题是在不清楚理解C++中的引用,指针和动态内存如何工作的情况下做出的.任何与此斗争的人,我建议阅读这些.
嘿家伙我有关于变量和If语句的问题.
我问的原因是我在变量的字符串向量中分配标记,但如果我的向量只有3个元素,我尝试将变量赋给myVector(5)我得到一个错误.
这是我解决这个问题的方法
std::string element5;
if(myVector.size () >= 4)
(
std::string element5 = myVector.at(4)
}
Run Code Online (Sandbox Code Playgroud)
但那不会改变if语句之外的字符串吗?如果我有5个元素并且没有错误检查我的代码工作正常但是如果我传入标准输入我真的不知道有多少元素我将知道最多有50个元素.
我不需要输出任何元素只需在每个元素上运行此代码
if(countSubstring(element5,"a") > 0)
{
a = a + 1
}
Run Code Online (Sandbox Code Playgroud)
然后我会输出一个.
如何让element5保持其新字符串?