捕获参考的稳定性

一个对象可以通过可变引用捕获,并在一个成员函数内部进行更改,该函数采用与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是别名的情况下强制执行这个常量。 我想所有我要找的是确认这是未定义的行为。 它是相当于在某种意义上到const_cast -使用值作为非const的情况下,它应该是什么?


引用或指向const的指针并不意味着被引用的对象根本不能被修改 - 它只是意味着对象不能通过这个引用/指针被修改。 它可能很好地通过另一个引用/指向同一个对象的指针进行修改。 这被称为别名。

以下是一个不使用lambdas或任何其他奇特功能的示例:

int x = 0;

void f() { x = 42; }

void g(const int& y) {
  cout << y;
  f();
  cout << y;
}

int main() {
  g(x);
}

没有任何未定义的事情发生,因为对象本身不是const ,并且别名的const主要是为了用户的好处。 为了彻底,相关部分是[dcl.type.cv]p3

对cv认证类型的指针或引用实际上不需要指向或引用cv认证的对象,但它被视为如此; 即使引用的对象是非常量对象, 并且可以通过其他访问路径修改,常量限定的访问路径也不能用于修改对象。 [注:Cv-qualifier被类型系统支持,所以不能在没有投射的情况下被破坏(5.2.11)。 - 注意]

链接地址: http://www.djcxy.com/p/77593.html

上一篇: Constness of captured reference

下一篇: Displaying a progress bar showing the progress of a form submission