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