基于范围的for循环的范围表达式使用const函数重载

时间:2016-08-03 20:47:08

标签: c++ c++11 for-loop foreach

更新,感谢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}的问题为了选择函数重载的目的。

2 个答案:

答案 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)) {}
}