根据c++语法,const int* const p意味着p所指向的值不能是rewritten.But,我发现如果我像这样编码:
void f(const int* const p)
{
char* ch = (char*) p;
int* q = (int*) ch;
(*q) = 3; //I can modify the integer that p points to
}在这种情况下,关键字"const“将失去使用"const”的effect.Is吗?
发布于 2013-11-28 16:40:07
在这里,您正在丢弃constness:
char* ch = (char*) p;实际上,你是在说“我知道我在做什么,忘记你是const,我接受后果。”C++允许您这样做,因为有时它可能是有用的/必要的。但它充满了危险。
注意,如果传递给函数的参数实际上是const,那么您的代码将导致未定义的行为(UB)。你无法从函数内部知道。
还请注意,在C++中,最好清楚地表明您的意图,
int* pi = const_cast<int*>(p);这清楚地表明,您的意图是抛弃const。它也更容易找到。同样的关于危险和UB的警告也适用。
发布于 2013-11-28 16:45:44
如果const int* const p指向一个编译时间常数,那么您的示例将使应用程序崩溃,当丢弃不稳定时,您需要确定您正在做什么。
C++是一种成人语言,额外的能量永远不会为短暂的安全而牺牲,这是代码作者的选择,是留在安全区还是使用cast操作符,向C/asm移动一步。
发布于 2013-11-28 16:43:06
C/C++会让你做很多让你“伤害”自己的事情。在这里,抛弃const of p是“合法的”,因为编译器假定您知道自己在做什么。这是否是好的编码风格是另一回事。
当您这样做时,您将对它可能产生的任何副作用和问题承担责任。在这里,如果参数中指向的内存是静态内存,程序可能会崩溃。
简而言之,仅仅因为你能做某事并不意味着这是一个好主意。
https://stackoverflow.com/questions/20271046
复制相似问题