簡體   English   中英

const“this”指針是否意味着其所有成員的常量性?

[英]Does const "this" pointer implies constness of all its members?

我知道如果我們在 function 聲明之后添加一個“const”限定符,這意味着隱含的“this”指針變為 const,因此我們不能直接修改任何成員

但是,在 const 成員 function 中,每個成員是否也自動成為 const?

為了說明我要問的問題,這是一個演示程序

#include <vector>

struct Foo {
    int a;
    int b;
};

class Demo {

public:
    Demo() = default;

    void bar(std::vector<Foo>::iterator it) const {}

    void baz() const {
        // begin() is supposed to return iterator, not const_iterator
        bar(vector.begin());
    }

private:
    std::vector<Foo> vector;
};

int main(void)
{
    Demo d;
    d.baz();

    return 0;
}

在 baz() 方法中,我正在調用 std::vector::begin() 方法,根據doc ,該方法可以返回iteratorconst_iterator

iterator begin() noexcept;
const_iterator begin() const noexcept;

我的理解是,如果將成員“vector”聲明為 const,例如

private:
  const std::vector<Foo> vector;

然后應調用返回const_iterator的重載形式。 否則,應調用返回可變iterator的重載形式,這是當前情況

當我嘗試編譯它時

g++ --std=c++17 -Wall

我遇到編譯錯誤

main.cpp:17:13: error: no viable conversion from '__wrap_iter<std::__1::vector<Foo, std::__1::allocator<Foo> >::const_pointer>' to
      '__wrap_iter<std::__1::vector<Foo, std::__1::allocator<Foo> >::pointer>'
        bar(vector.begin());
            ^~~~~~~~~~~~~~

本質上vector.begin()返回一個const_iterator而不是iterator

現在我很困惑,我沒有將vector聲明為 const,為什么仍然調用返回const_iterator的重載形式?

是因為 baz() 聲明為 const 嗎? 據我所知,在const成員function中,與當前object直接關聯的所有memory不得修改,但我不希望這會對function重載造成這樣的影響。 當且僅當 vector 被聲明為 const 成員時,我希望vector.begin()返回一個 const_iterator,例如

private:
  const std::vector<Foo> vector;

提前致謝

就像每個人都說過的,如果thisconst ,那么this指向的任何成員都是const

此外,如果您使用mutable關鍵字聲明它,則可以在const function 或上下文中讓成員變量成為非const ... 如果您想要這種行為。

class Demo {
public:
  Demo() = default;

  void bar(std::vector<Foo>::iterator it) const {}

  void baz() const
  {
    // begin() now returns iterator instead of const_iterator
    bar(vector.begin());
  }

private:
  mutable std::vector<Foo> vector; // vector is non-const in const functions
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM