[英]Understanding const_cast in C++
我試圖理解const_cast
。
在下面的例子中, items_
是一個私有成員變量。
getItems()
方法是一個const
方法,這意味着它不能修改成員變量items_
。
getItems()
返回一個const vector
引用,這意味着您不能修改成員變量items_
。
我的問題是,這里需要const_cast
嗎? 我不這么認為,因為我不需要拋棄常數?
#include <iostream>
class test {
std::vector<Item> items_;
public:
const std::vector<Item>& getItems() const;
};
const std::vector<mv::Item>& mv::Workloads::getItems() const
{
return const_cast<std::vector<Item>&>(items_);
}
這不僅是不必要的,而且在那個地方顯然是錯誤的。
考慮從返回類型中刪除const
時會發生什么:
/*const*/ std::vector<mv::Item>& mv::Workloads::getItems() const
{
return const_cast<std::vector<Item>&>(items_);
}
現在該方法返回對const
對象的非常量引用! 注意,這個方法本身聲明為const
,因此this
是const
在這種方法的情況下,也items_
是const
。 當在const test
實例上調用該方法時,使用該方法返回的引用將導致未定義的行為。
從這個意義上說,如果您決定更改返回類型,則這里const_cast
的唯一作用是潛在地消除重要的編譯器錯誤。
另一方面,在方法中(即返回一個const
引用)沒有理由進行強制轉換。 items_
是const
並且返回對它的const
引用。
const_cast
很有用,例如,當您確實知道您將const
的對象實際上不是const
,可以避免const
和非const
方法的代碼重復,請參閱此處了解詳細信息。
PS :如果您確實想從const
方法返回對成員的可變引用,則可以聲明成員mutable
。 也不需要const_cast
。 但是, mutable
應該小心使用,通常一開始就不需要。
這不是必需的,只需返回_items
。
const 成員函數將對象本身 ( *this
) 視為 const,因此每個數據成員都被視為 const,允許從中構建和返回 const 引用。
#include <iostream>
using namespace std;
class test {
std::vector<Item> items_;
public:
const std::vector<Item>& getItems() const;
};
const std::vector<mv::Item>& mv::Workloads::getItems() const
{
return items_;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.