[英]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.