[英]How C++ do overload resolution for this “vector[0] = 1;”
據我所知,C ++僅基於參數或隱含對象參數具有函數重載。 但是我發現向量有兩個operator []。 它將在以下代碼中選擇正確的功能:
std::vector<int> v;
v[0] = 1; // This will select the non-const version.
return &v[0]; // This will select the const version.
誰能解釋這是怎么發生的?
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
------編輯1 ------
我認為它將選擇const版本,因為后續cc文件無法使用clang ++和g ++進行編譯,並出現以下錯誤。 不理解以下錯誤。 誰能解釋更多?
錯誤:無法使用類型為“ const value_type *”(又名“ const char *”)的右值初始化“ char *”類型的返回對象,返回data_.size()== 0嗎? NULL:(&data_ [0]);
#include <assert.h>
#include <deque>
#include <vector>
#include <map>
class X
{
public:
X() {
}
virtual ~X() {
}
char* data() const {
return data_.size() == 0 ? NULL : (&data_[0]);
}
size_t size() const {
return data_.size();
}
private:
std::vector<char> data_;
};
實際上,在兩種情況下都調用非const
版本。 調用const
版本的時間將是vector
是const
。
std::vector<int> const v = {1,2,3};
int x = v[0];
在上述情況下,嘗試調用非const
版本會導致編譯器錯誤
v[0] = 5; // nope can't call non-const version, this is trying to mutate a const variable
編輯
關於您的示例,基於功能的簽名
char* data() const
您已經聲明方法data
為const
,這意味着它不得嘗試突變任何成員變量 。 換句話說, const
函數中的所有成員變量都被視為const
。 在const
方法的上下文中,該變量被視為
std::vector<char> const data_;
由於v
是非常vector
,因此永遠不會調用const
版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.