gpt4 book ai didi

c++ - 在 for 循环中取消引用

转载 作者:行者123 更新时间:2023-12-02 18:05:26 25 4
gpt4 key购买 nike

显然我有错误的假设,即取消引用指针总是会创建一个临时对象。例如,在下面的代码中

vector<string> *vecptr = new vector<string>();
...populate vector...
for(string& str: *vecptr)
{ //do something }

我一直认为 *vecptr 会创建一个本地临时对象并且效率低下。我不愿意在循环中取消引用,并且会做类似的事情

for(vector<string>::iterator str = vecptr->begin(); ....

为了避免取消引用。我刚刚了解到,在第一种情况下取​​消引用不会创建临时对象,因此无需避免它。在这种情况下避免创建临时对象的 C++ 规则是什么?正常情况下

string str = *ptr_string;

会复制,因为在这种情况下 *ptr_string 是右值?为什么它与 for 循环不同?

最佳答案

so there is no need to avoid it.

嗯,有理由尽可能避免间接。但这个“暂时”并不是这样的原因,因为它不是真的。

What is the C++ rule that avoids creating temporary object in such a case.

只是没有规则规定将创建临时对象。

will copy since *ptr_string is an rvalue in this case?

*ptr_string 是左值;不是右值。 (假设 decltype(ptr_string) 是 std::string* ;它可能是类类型的一元 * 运算符的奇怪重载的右值)。

string str = ... 将复制,因为它是复制初始化值对象。

Why is it different with the for loop?

这与 for 循环没有什么不同。您也可以使用循环进行复制:

for(string  str: *vecptr)
// ^ is not a reference: therefore it is a copy of the element

以及不带“常规”变量的拷贝:

string& str = *ptr_string;
// ^ is a reference: therefore not a copy

即使您没有通过指针间接寻址,而是使用其他一些左值(例如引用或变量名称),它也完全相同。

关于c++ - 在 for 循环中取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60733137/

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