使std :: fill调用非const限定运算符重载

时间:2016-03-11 21:20:41

标签: c++ stl operator-overloading const

我试图用数字1 - 100填充数组。我用了std::fill。现在,std::fill的最后一个参数是填充范围的数字。我以为我可以聪明,并传入一个int重载的对象,所以当它分配范围元素时,它也会自动增加对象中的数字。

class AutoInc {

public:

    operator int() {
        number++;
        return number - 1;
    }

    int number = 1;

};

...以及以下对std::fill的调用:

int numbers[100];
std::fill(numbers, numbers + 99, (AutoInc());

它抛出一个错误,说它找不到AutoInc的int重载。这是因为std::fill采用const-reference,并且因为int重载不是const,所以它不会调用它。当我将重载更改为const限定,并且我不修改number时,程序可以工作(当然没有正确填充数组)。有没有解决的办法?我知道我可以使用for循环来填充数组,但我也在讨论其他带有const引用的STL函数。

2 个答案:

答案 0 :(得分:4)

如果您的问题是关于是否可以强制STL算法在const引用传递的对象上调用非const成员函数,答案就是您不能。

一种解决方法是将number标记为mutable成员。然后允许const成员函数对其进行修改。

但是,我建议你在做这类事之前要仔细考虑。该函数可能有一个很好的理由采用const引用。在std::fill的情况下,标准实际上没有指定必须以任何特定顺序填充范围。如果你传入的东西在每次被调用时会产生不同的int值,那么就不能保证你得到1 2 3 4 ......但是如果你传入了一些不使用任何技巧的东西这个,那顺序是什么并不重要,你总能得到相同的结果。

正如我在评论中指出的那样,std::iota是你在这种情况下应该使用的。在更一般的情况下,您需要std::generate,它通过调用按值传递的函数对象来填充范围。

答案 1 :(得分:1)

您可以使用的一个选项是将number限定为mutable

mutable int number = 1;

然后你可以使用:

operator int() const {
    return number++;
}

但是,正如评论中所建议的那样,最好使用std::iota