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);
}