gpt4 book ai didi

c++ 右值传递给一个常量引用

转载 作者:行者123 更新时间:2023-12-01 09:38:48 25 4
gpt4 key购买 nike

我试图了解有关引用和右值的确切 C++(C++0x 之前)行为。以下内容有效吗?

void someFunc ( const MyType & val ) { 
//do a lot of stuff
doSthWithValue ( val);
}

MyType creatorFunc ( ) {
return MyType ( "some initialization value" );
}

int main () {
someFunc ( creatorFunc() );
return 0;
}

我在尝试修改的库中发现了类似的代码。在Visual Studio 2005下发现代码崩溃了。
我对上述内容的理解方式是:
creatorFunc 按值返回,因此创建了一个临时 MyType 对象 obj1。 (并保持......在堆栈上?)someFunc 正在引用该临时对象,并且随着计算的进行,临时对象被覆盖/释放。
现在,令人难以置信的是代码通常可以正常工作。更重要的是,通过一段简单的代码,我无法重现崩溃。
这里发生了什么/应该发生什么?引用 (val) 是否为 const 是否重要?从 creatorFunc 返回的对象的生命周期是多少?

最佳答案

返回值具有临时值的生命周期。在 C++ 中,这意味着创建该类型的完整表达式,因此在调用 someFunc 返回之前不应调用 MyType 的析构函数。

我很好奇您的“被覆盖/释放”。当然在这个对象上调用 delete 是不行的;它存在于堆栈中,删除它可能会导致堆损坏。此外,覆盖/修改它也可能很糟糕。您的示例使用常量“C 字符串”;在许多编译器上,像这样的值存储在只读内存中,因此稍后尝试修改它可能会导致崩溃/访问冲突。 (不过,我不确定 Visual C++ 是否会进行这种优化)。

通过 const 传递临时引用与传​​递可变引用之间存在很大差异。标准 C++ 不允许创建对临时对象的可变引用,并且大多数编译器(包括 GCC)会拒绝它,尽管至少某些版本的 Visual C++ 允许这样做。

如果你用可变引用传递它,你要写的是:

   MyType t = creatorFunc();
someFunc(t);

关于c++ 右值传递给一个常量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3119431/

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