使用std :: function参数重载函数:为什么const方法永远不会被调用?

Lea*_*der 4 c++ overloading const c++11

#include <functional>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class A
{
    public:
    void doStuff(function<void (const string *)> func) const
    {
        cout << "Const method called" << endl;
        for(const auto& i_string : m_vec)
            func(i_string);
    }

    void doStuff(function<void (string *)> func)
    {
        cout << "Non-const method called" << endl;
        doStuff([&func](const string *str)
        {
            auto mutableString = const_cast<string *>(str);
            func(mutableString);
        });
    }

private:
    vector<string *> m_vec;
};

int main()
{
    auto a = A{};

    a.doStuff([](string *str){
        *str = "I modified this string";
    });
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,永远不会调用const方法.如果代码看起来很奇怪,这就是我想要做的:

我让客户端通过传递函数来迭代对象,而不是getter方法.要启用const和非const访问,我想提供const和非const重载.此外,为了避免复制和粘贴,我想根据const方法实现非const方法:我的代码中的const方法实际上比我在这里使用的方法更复杂.

现在,我的问题是:如果运行此代码,它将递归调用非const函数,直到堆栈溢出.我不明白为什么doStuff([&func](const string *str)非const方法中的行调用自身而不是const方法.

Ste*_*oft 5

非const方法被声明为可以使用string *参数调用的接受函数.提供的功能接受const string *.string *被隐含地转换为const string*.因此,函数with const string *是非const方法的可接受参数,并且选择非const方法,因为它this也是非const.

使用const_caston this来使用const方法:

const_cast<const A*>(this)->doStuff(…);
Run Code Online (Sandbox Code Playgroud)