gpt4 book ai didi

c++11 - 捕获引用的一致性

转载 作者:行者123 更新时间:2023-12-04 12:32:10 24 4
gpt4 key购买 nike

一个对象可以通过可变引用来捕获,并在一个成员函数中进行更改,该成员函数采用与 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 的指针并不意味着完全不能修改被引用的对象——它只是意味着不能修改对象 通过此引用/指针 .它很可能通过另一个指向同一对象的引用/指针进行修改。这被称为 aliasing .

这是一个不使用 lambdas 或任何其他花哨功能的示例:

int x = 0;

void f() { x = 42; }

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

int main() {
g(x);
}

没有任何未定义的事情发生,因为对象本身不是 const , 别名的常量性主要是为了用户的利益。为彻底起见,相关部分是 [dcl.type.cv]p3 :

A pointer or reference to a cv-qualified type need not actually point or refer to a cv-qualified object, but it is treated as if it does; a const-qualified access path cannot be used to modify an object even if the object referenced is a non-const object and can be modified through some other access path. [ Note: Cv-qualifiers are supported by the type system so that they cannot be subverted without casting (5.2.11). —end note ]

关于c++11 - 捕获引用的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com