与const和non-const相同的对象,我应该假设什么行为正确
Same object as const and non-const, what should I assume to behave correctly?
我有一个形式的函数
return_type function(const argument_type & a, argument_type & b);
如果传递了与a
和b
相同的对象,我可以继续执行该函数(从而可能对其进行修改)还是停止?
我不知道编译器的假设是如何在这种情况下传播的。
我的猜测是,将其作为非常量b
传递的非常量假设应该足够并允许修改,但这只是猜测。
大多数答案都是关于能够修改a
或b
,或调用非常量方法。我知道,如果我传递与const
和non-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){/*...*/;} // ???
我发现的最相似的问题(但不是真的)
通过指向self-的非常量指针修改const方法中的self-
的问题
return_type function(const argument_type & a, argument_type & b);
调用CCD_ 8是函数可能是
通过形式参数
b
修改对象,而同时期望形式参数CCD_ 10保持不变。
因此,您可能会破坏函数的假设,导致例如错误的结果或崩溃。
有一个函数在设计时经常具有这种签名,即复制赋值运算符。它的常量形式参数a
是显式提供的参数,而它的可变形式参数(如果可以这样称呼的话)是隐式*this
。它可以检查自引用(参数的别名),也可以复制和交换。
总之,是否可以安全地使用与参数a
和参数b
相同的对象调用函数取决于函数,但很可能会违反函数的假设,即形式参数引用不同对象是隐含的先决条件。
您可以决定是否可以用两次给定的相同参数调用该函数
无论如何,你不应该试图确定你是否两次得到同一个对象,只要你的算法的正确性不取决于它,或者你没有保证。
它们在运行时以完全相同的方式传递,相同的引用/指针指向完全相同的东西。
与const
的区别仅发生在编译时。编译器将确保您只调用const
方法,而不是试图修改此const
对象的属性,否则会引发编译错误,因为您不应该修改它。
我的猜测是,将其作为非常量b传递的非常量假设应该足够并允许修改,但这只是猜测。
是的,function
可以通过b
调用非const
方法,但不能通过a
调用。
直观地说,这意味着如果相同的对象也通过非const
引用b
传入,则function
可以更改通过const
引用a
传入的对象。
通常,const
只保证可以或不能对const
变量执行什么操作。可能还有其他变量引用const
变量,或者引用其中的对象,使const
变量能够被一个看起来不像是在修改const
变量的函数修改。
回到您的案例,这取决于比function
更高级别的函数和类,它们自己对使用const
参数、成员函数等可以修改和不能修改的内容实施约束。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 假设声明中某些上下文中需要的名称查找规则是什么
- 假设包含所有必需的头文件,输出将是什么
- 假设动态范围,以下C++程序的输出是什么
- 对于C++实现的字符集,什么假设是安全的?
- 与const和non-const相同的对象,我应该假设什么行为正确