Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const强制转换临时的const引用会导致未定义的行为吗?_C++ - Fatal编程技术网

C++ const强制转换临时的const引用会导致未定义的行为吗?

C++ const强制转换临时的const引用会导致未定义的行为吗?,c++,C++,C++允许将临时引用绑定到常量引用,从而延长其生命周期。我的问题是:如果我通过const强制转换来修改对象,这是未定义的行为吗?让我们假设我的新引用不会比原始const引用长,因此它将始终指向内存中的有效对象 如果它确实调用了未定义的行为,为什么?对象位于堆栈上,如果我可以读取它,为什么不能修改它?我理解为什么这可能是个坏主意,因为临时性的将很快被破坏,但是它是无效的C++吗?在我的测试中,我的程序在修改一个临时文件后运行良好。如果您想延长临时文件的生存期,使其成为非常量,只需将其绑定到一个右值

C++允许将临时引用绑定到常量引用,从而延长其生命周期。我的问题是:如果我通过const强制转换来修改对象,这是未定义的行为吗?让我们假设我的新引用不会比原始const引用长,因此它将始终指向内存中的有效对象


如果它确实调用了未定义的行为,为什么?对象位于堆栈上,如果我可以读取它,为什么不能修改它?我理解为什么这可能是个坏主意,因为临时性的将很快被破坏,但是它是无效的C++吗?在我的测试中,我的程序在修改一个临时文件后运行良好。

如果您想延长临时文件的生存期,使其成为非常量,只需将其绑定到一个右值引用即可。不要进行不必要的强制转换。

如果要延长临时变量的生存期,使其成为非常量,只需将其绑定到右值引用即可。不要做不必要的铸造。

谁说它存在于堆栈中,而不是(比如)部分存在于寄存器中?如果编译器决定假定它不会被修改,并进行相应的优化,该怎么办?可以获取常量引用的地址,因此它必须存在于内存中,对吗?一般来说,临时文件可能不需要在内存中,但绑定到常量引用的临时文件需要有地址。谁说它位于堆栈上,而不是(比如)部分位于寄存器中?如果编译器决定假定它不会被修改,并进行相应的优化,该怎么办?可以获取常量引用的地址,因此它必须存在于内存中,对吗?一般来说,临时文件可能不需要在内存中,但是绑定到常量引用的临时文件需要有一个地址。对于C++11您是对的,但是对于以前没有右值引用的标准呢?另外,没有回答我的问题:)@GeorgiosBitzes:Oli已经回答了本地参考案例的字面问题。人们可以对对象状态的大小和不可预测性进行推理,并说,嘿,对于这个对象,没有编译器可以预测状态或将状态的某些部分保存在寄存器或。。。但是UB是UB。当绑定到函数的形式参数时,情况就不同了,该函数返回的引用中删除了const。首先,没有生命周期的延长。第二,这是一种并不少见的C++03技术,所以如果我们正式使用UB,我会感到惊讶。你对C++11是正确的,但是以前没有右值引用的标准呢?另外,没有回答我的问题:)@GeorgiosBitzes:Oli已经回答了本地参考案例的字面问题。人们可以对对象状态的大小和不可预测性进行推理,并说,嘿,对于这个对象,没有编译器可以预测状态或将状态的某些部分保存在寄存器或。。。但是UB是UB。当绑定到函数的形式参数时,情况就不同了,该函数返回的引用中删除了const。首先,没有生命周期的延长。其次,这是一种并不少见的C++03技术,所以如果我们正式使用它,我会感到惊讶。