为什么将operator()作为std::function调用不起作用

问题描述 投票:0回答:1

考虑这个旨在收集字符串序列的小类:

class issues_t final
{
 private:
    std::vector<std::string> m_issues;

 public:
    constexpr void operator()(std::string&& txt)
       {
        m_issues.push_back( std::move(txt) );
       }
};

我计划将其用作:

issues_t issues;
do_something(issues);

这有效:

void do_something(issues_t& notify_issue)
{
    notify_issue("something");
}

但我宁愿把它当作:

using fnotify_t = std::function<void(std::string&&)>;
void do_something(fnotify_t const& notify_issue)
{
    notify_issue("something");
}

这可以编译,但不起作用:在调试器中,

push_back()
被执行,但下划线向量未填充(godbolt),所以我在这里缺少什么?

c++ std-function
1个回答
0
投票

do_first
接受可以绑定到临时对象的
const&
。 调用
do_first
时,会构造一个临时
std::function
对象,并且
"do_first"
字符串存储在它包含的临时
issues_t
中,而不是存储在原始
issues_t issues
中。

您的设计很容易出现此类错误,使用模板和 lambda 可能更方便:

template <typename F>
void do_first(F f) {
    f("do_first");
}

int main() {
    std::vector<std::string> issues;

    do_first([&issues](std::string&& s) { issues.push_back(s); });
}
© www.soinside.com 2019 - 2024. All rights reserved.