当原始数据为const时,是否要修改指针指向的UB?

Joã*_*ulo 0 c++ pointers const undefined-behavior

当指针的数据为const时,更改指针指向的位置是否为未定义行为?例:

const char* p = "foo";
p = "boo";
Run Code Online (Sandbox Code Playgroud)

我相信这不是UB,因为指针本身不是const,并且我没有修改该"foo"对象。

额外的问题:并更改不是const指针的const数据?会UB吗?例:

char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

我相信这不是UB,因为指针本身不是const,并且我没有修改“ foo”对象。

这是对的。指针不是,const因此您可以根据需要将其更改为指向其他对象。在这种情况下,它不会导致内存泄漏,但请记住,如果指针指向随分配的数据,new并且它是指向该数据的唯一指针,则需要delete在重新分配指针之前先调用它,否则会出现内存泄漏。

额外的问题:并删除指针的常量性?会UB吗?

如果您尝试修改const从中删除的对象,则只有UB const,在这种情况下,您要这样做。只是删除const是可以的,有时是需要的,但是除非您不const以该对象为准,否则永远不允许您修改该对象。例如,以下是合法的,因为foo不是const

int foo = 42;

void bar(int const& baz) { const_cast<int&>(baz) = 21; }

int main()
{
    bar(foo);
}
Run Code Online (Sandbox Code Playgroud)

另一方面

const int foo = 42;

void bar(int const& baz) { const_cast<int&>(baz) = 21; }

int main()
{
    bar(foo);
}
Run Code Online (Sandbox Code Playgroud)

是不合法fooconst