簡體   English   中英

基於范圍的for循環的范圍表達式以使用const函數重載

[英]Range expression of range-based for loops to use const function overloads

更新,感謝AlexD的回答 :這個問題歸結為選擇成員函數重載的語言規則,以下問題對此進行了討論: 調用const函數而不是其非const版本


基於范圍的for循環的范圍表達式是對具有const和非const重載的成員函數的調用時,似乎選擇了非const重載。 結果,以下程序無法編譯:

#include <iostream>
#include <vector>

class foo {
    public:
        const std::vector<int>& get_numbers() const { return numbers; }
    protected:
        std::vector<int>& get_numbers() { return numbers; }
    private:
        std::vector<int> numbers;
};

int main() {
    foo f;
    for (int x : f.get_numbers()) std::cout << x << std::endl;
}

來自gcc 5.3的診斷消息:

error: 'std::vector<int>& foo::get_numbers()' is protected

但是可以使用const版本的get_numbers() 我們可以通過使用對foo實例的const引用來強制使用它,如下所示:

int main() {
    foo f;
    const foo& g = f;
    for (int x : g.get_numbers()) std::cout << x << std::endl;
}

有沒有更好/更容易的方法告訴編譯器可以並且應該使用const成員函數重載,而無需顯式對對象進行const引用?

關於使基於范圍的for循環使用const迭代器,存在一些類似的問題 ,但是我還沒有發現出於選擇函數重載的目的而使循環的范圍表達式為const任何問題。

但是可以使用const版本的get_numbers()

在考慮可訪問性之前,已選擇最佳功能。 標准狀態(強調我的):

如果存在最佳可行的功能並且是唯一的,那么過載解析將成功並產生結果。 否則,重載解析將失敗並且調用格式錯誤。 如果重載解析成功,並且在使用它的上下文中無法訪問最佳可行功能 (第11條),則程序格式錯誤。

一個簡單的模板函數as_const可以使轉換不那么難看。 我相信這是正在添加或最近添加到標准庫。

template <typename T> T const & as_const (T const & t) { return t; }

void f ()
{
    for (auto && x: as_const (y)) {}
}

暫無
暫無

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

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