C++ 丢弃常数*会导致未定义的行为吗?

C++ 丢弃常数*会导致未定义的行为吗?,c++,constants,undefined-behavior,C++,Constants,Undefined Behavior,编译以下代码。它似乎运行良好 但它会导致任何未定义的行为吗 我想扔掉这个*的常数 这是为了允许常量my_迭代器改变它所指向的数据 测试: A类{ 公众: A(常数int x):x_ux{} 无效集_x(int x){x_x=x;} 空集_x2(常数int x)常数{ const_cast(*this).set_x(x); } int x_2;; }; int main(){ A(10); a、 设置_x2(100); } 您的示例不是未定义的行为,因为a不是const。但是,如果a为const,

编译以下代码。它似乎运行良好

但它会导致任何未定义的行为吗

我想扔掉这个*的常数

这是为了允许
常量my_迭代器
改变它所指向的数据

测试:

A类{
公众:
A(常数int x):x_ux{}
无效集_x(int x){x_x=x;}
空集_x2(常数int x)常数{
const_cast(*this).set_x(x);
}
int x_2;;
};
int main(){
A(10);
a、 设置_x2(100);
}

您的示例不是未定义的行为,因为
a
不是
const
。但是,如果
a
const
,则为:

int main() {
    const A a(10);
    a.set_x2(100);
}

为什么
set_x2
必须是
const
?您的示例在没有添加
constness
const\u cast
@HenriMenke的情况下运行良好,我不认为这是UB,因为
a
开始时是非常量的with@Justin你说得对。但是如果
a
是常量,那么它将是UB。@Rzu作为
const
的迭代器并不意味着它指向的东西是
const
。这就像在
const
指针和指向
const
数据的指针中一样。似乎您混淆了这两者。@Rzu让我们想象一下,在
std::vector::iterator
中,您有一个
int*internalIterator。如果您有一个
const std::vector::iterator
,那么
const
仅适用于顶层,因此
internalIterator
成员将是一个
int*const internalIterator
,而不是
int-const*const internalIterator
,如果原始
*此
是const>,则这是正确答案,那么它是未定义的。因此,你有责任知道你能做什么和不能做什么。这是对上述问题的正确回答,但我很确定这不是OP应该首先问自己的问题。同意,对于
mutable
来说,只有一些有效的用法,而对于
const\u cast
来说就更少了。新的问题在这里:
int main() {
    const A a(10);
    a.set_x2(100);
}