更新,感謝AlexD的回答:這個問題歸結爲語言規則的選擇成員函數重載,這是在以下問題討論:Calling a const function rather than its non-const version範圍表達重載
當range-based for loop的範圍表達是與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()
可用,可用於。我們可以迫使它通過使用const
參考foo
實例中使用,如:
int main() {
foo f;
const foo& g = f;
for (int x : g.get_numbers()) std::cout << x << std::endl;
}
有沒有更好/更簡單的方法來告訴它可以而且應該使用const
成員函數重載的編譯器,沒有明確提出const
引用該對象?
有一些similar questions有關使for循環使用基於範圍的const
迭代器,但我還沒有發現有關使循環的範圍表達式const
選擇函數重載的目的的任何問題。
我相信這是因爲'f'聲明爲'foo f;'而不是'const foo f;'這就是爲什麼非常量重載函數被選爲const的原因。我的問題是爲什麼你需要'getNumbers()'公共和私人? – DimChtz
避免任何私人/受保護的getter/setter(或使用不同的名稱) –
@DimChtz是的,這是問題所在。選擇的過載是函數簽名,而不是返回類型。 – doug