c++ - 与 const 和非常量相同的对象,我应该假设什么才能正确运行?

标签 c++ compiler-construction constants standards

我有一个表单的函数

return_type function(const argument_type & a, argument_type & b);

如果相同的对象作为 ab 传递,我可以继续该函数(从而可能修改它)还是停止?

我不知道编译器假设如何在这种情况下传播。

我的猜测是,将其作为非常量 b 传递的非常量假设应该足够并允许修改,但这是一个猜测。


大多数答案都是关于能够修改ab,或者调用非常量方法。我知道,如果我将同一个对象作为 constnon-const 传递,我就可以做到。我的疑问更多在于函数返回时我将离开程序的状态,以及它是否可以打破一些编译器假设,例如:

class A(){
    int value;
}

void function1(const A & arg1);
void function2(A & arg1);
void function3(const A & arg1, A & arg2);

A a;
a.value=5;
function1(a);
if(a.value==5){/*...*/;} // the if can be optimized out to true, because [a] was const

a.value=5;
function2(a);
if(a.value==5){/*...*/;} //must be checked, [a] could have been modified

a.value=5;
function3(a, a);
if(a.value==5){/*...*/;} // ??? 

我发现的最相似的问题(但不是真的)

Modifying self within const method via non const pointer to self

最佳答案

问题

return_type function(const argument_type & a, argument_type & b);

调用function( o , o ) 可能是函数

  • 通过形参b修改对象,而

  • 同时期望形式论证a保持不变。

所以你可能会打破函数的假设,导致例如结果不正确或崩溃。


设计 经常有一个函数具有这种签名,即复制赋值运算符。它的常量形式参数 a 是显式提供的参数,而它的可变形式参数(如果可以这样称呼的话)是隐式的 *this。它可以检查自引用(参数的别名),也可以 copy-and-swap 。


总而言之,您是否可以使用与参数 a 和参数 b 相同的对象安全地调用该函数取决于函数,但您可能会违反函数的假设,它有一个隐含的先决条件,即形式参数引用不同的对象。

关于c++ - 与 const 和非常量相同的对象,我应该假设什么才能正确运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23001360/

相关文章:

c++ - 为什么 wcslen 在 argv[1] 上计算 1 个额外字符?

visual-studio - dll 文件或 .exe 文件丢失

c++ - 解析时即时收集类定义

c++ - Typedef、模板和 const 关键字

C++ 算术 if 运算符

java - 值为 1.9999 的常量叫什么

c - 如何将非 const 动态多维数组传递给需要 const 多维数组的函数?

constants - 为什么在这些 julia 函数中不尊重常量性?

c++ - C1001 : An internal error has occurred in the compiler when including <boost/shared_ptr. hpp>

c - 常量 C 表达式是在编译时还是在运行时求值?