更新,感谢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
成员函数重载,而不明确地对该对象进行const
引用?
有一些similar questions关于使用基于范围的循环使用const
迭代器,但我还没有发现任何关于制作循环范围表达式{{1}的问题为了选择函数重载的目的。
答案 0 :(得分:3)
但
const
get_numbers()
版$(document).ready(function(){ var regionDropDown = $('.region_dropdown_section'), regionButton = regionDropDown.find('button'), regionList = regionDropDown.find('.region_dropdown_content').children(); $(regionList).on('click', function(e){ var region = e.target; regionButton.text(region.text).val(region.text); }); });
可用,可以使用。
在考虑可访问性之前选择最佳功能。标准陈述(强调我的):
如果存在最佳可行功能并且是唯一的,则重载决策成功并将其作为结果产生。 否则重载解析失败并且调用格式错误。 当重载解析成功时,和 在使用它的上下文中,无法访问最佳可行功能 (第11条),该程序是 不良形成。
答案 1 :(得分:0)
一个简单的模板函数as_const
可以使演员不那么难看。我相信这是在标准库中添加或最近添加的。
template <typename T> T const & as_const (T const & t) { return t; }
void f ()
{
for (auto && x: as_const (y)) {}
}