考虑这个旨在收集字符串序列的小类:
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),所以我在这里缺少什么?
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); });
}