gpt4 book ai didi

c++ - 为什么 const std::vector 将 const 应用于包含的对象?

转载 作者:行者123 更新时间:2023-12-01 14:03:45 27 4
gpt4 key购买 nike

我知道const std::vector<int>适用于 constint s 也是,(例如 begin() const 将返回一个 const_iterator )。我很好奇这样做的原因。在我看来,应用 const 会更有意义。仅针对 vector (例如不调整大小),并将包含的对象的常量性留给它们(例如 std::vector<const int> )。

这有充分的理由吗?如果是这样,有人可以向我解释一下吗?或者这只是 STL 最初时期的疏忽,由于向后兼容性而无法再纠正?

最佳答案

C++ 中的常量是一个语义概念,意思是“不能使用这个名称来改变这个对象的可观察状态”。在 vector 的情况下,它的内容被认为是其可观察状态的一部分,所以如果 vector 是常量,那么它的元素也必然是常量。

这也意味着您可以为其他代码提供对您的 vector 的 const 引用,并且肯定不会更改您的 vector (此处明确引用以供说明):

std::vector<int> a = create_a_vector();
std::vector<int> const & b = a;
something_else(b);

除非 something_else()狡猾地要抛弃 const 限定符,您可以确定它不会以任何方式改变 vector 或其内容。

如果类型按您的建议工作,则必须复制 vector :
std::vector<int> a = create_a_vector();
std::vector<const int> b = a;
something_else(b);

如果 vector 很大,这将对性能产生相当大的影响。

附录:问题的症结似乎是“为什么 vector 部分的内容是可观察状态?”

我能解释这一点的最好方法是通过以下问题来说明:
  • 如果你复制一个 vector ,元素会被复制吗?
  • 如果比较两个 vector 是否相等,是比较元素,还是仅比较 vector 的属性(大小)?

  • 如果这些问题的答案是"is",那么元素本身也是可观察状态的一部分。所以,这建立了一种规则: 在复制构造/赋值期间复制或在相等测试期间进行比较的任何内容都是对象的可观察状态的一部分。

    对于 vector ,答案是肯定的。因此,元素被认为是 vector 的可观察状态的一部分,如果 vector 本身是常量,它们必须被视为常量。

    将此与 std::unique_ptr 对比.只有指针值本身是可观察状态的一部分; const std::unique_ptr<int> 的指针值不能变异,但指针目标可以。这是有道理的,因为:
  • (您不能复制 std::unique_ptr ,因此我们不能考虑测试的这一部分。)
  • 如果比较两个 std::unique_ptr s 为相等,实际只比较指针值;目标的值(value)不是。

  • 因此,对于 std::unique_ptr ,目标的值不是可观察状态和 std::unique_ptr 的常量的一部分对象与指针目标是否可以变异无关。

    关于c++ - 为什么 const std::vector 将 const 应用于包含的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62050625/

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