捕获参考的常数

时间:2014-02-19 22:52:12

标签: c++11 const

对象可以通过可变引用捕获,并在成员函数内部更改,该成员函数采用与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范围内变异。我知道编译器不能在不证明xy是别名的情况下强制执行constness。我想我正在寻找的是确认这是未定义的行为。在某种意义上它与const_cast是否相同 - 在应该存在的上下文中使用非const的值?

1 个答案:

答案 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)。 - 后注]