[英]Why does const_cast remove constness for a pointer but not for a pointer to a const?
[英]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 ,該方法可以返回iterator
或const_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;
提前致謝
就像每個人都說過的,如果this
是const
,那么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.