对象可以通过可变引用捕获,并在成员函数内部更改,该成员函数采用与const
相同的对象。
void g(const int& x, std::function<void()> f)
{
std::cout << x << '\n';
f();
std::cout << x << '\n';
}
int main()
{
int y = 0;
auto f = [&y] { ++y; };
g(y, f);
}
对象在const
范围内变异。我知道编译器不能在不证明x
和y
是别名的情况下强制执行constness。我想我正在寻找的是确认这是未定义的行为。在某种意义上它与const_cast
是否相同 - 在应该存在的上下文中使用非const
的值?
答案 0 :(得分:4)
对const的引用或指针并不意味着根本不能修改引用的对象 - 它只是意味着无法通过此引用/指针修改对象。它可以通过另一个指向同一对象的引用/指针进行修改。这称为aliasing。
这是一个不使用lambdas或任何其他奇特功能的示例:
int x = 0;
void f() { x = 42; }
void g(const int& y) {
cout << y;
f();
cout << y;
}
int main() {
g(x);
}
没有任何未定义的内容,因为对象本身不是const
,而别名上的constness主要用于用户的好处。为了彻底,相关部分为[dcl.type.cv]p3
:
指向cv-quali fi ed类型的指针或引用无需实际指向 或者参考cv-quali fi ed对象,但它被视为具体;一个 const-quali fi ed访问路径即使不能用于修改对象 引用的对象是非const对象,可以进行修改 通过其他一些访问路径。 [注:Cv-quali firs 由类型系统支持,以便在不进行强制转换的情况下不会破坏它们(5.2.11)。 - 后注]