簡體   English   中英

C ++如何對此“ vector [0] = 1;”進行重載解析

[英]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版本的時間將是vectorconst

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

您已經聲明方法dataconst ,這意味着它不得嘗試突變任何成員變量 換句話說, const函數中的所有成員變量都被視為const const方法的上下文中,該變量被視為

std::vector<char> const data_;

由於v是非常vector ,因此永遠不會調用const版本。

暫無
暫無

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

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