了解C++中函数的值类别
Understanding value category of functions in C++
首先,我已经通读了这篇文章,解释了std::move
和std::forward
的功能。在那篇文章中,有一个示例代码片段,如下所示,我在测试中使用了它。
std::map<std::string, std::function<void()>> commands;
template<typename ftor>
void install_command(std::string name, ftor && handler)
{
commands.insert({
std::move(name),
std::forward<ftor>(handler)
});
}
由于我想尝试实际用法,我编写了一段简单的代码,如下所示。
#include <iostream>
#include <map>
#include <functional>
using namespace std;
// code copied from above goes here
void fnA() { cout << "Function A." << endl; }
function<void()> fnB = [&]() -> void {
cout << "Function B." << endl;
}
void RunTest() {
install_command("#1", fnA);
install_command("#2", move(fnA));
install_command("#3", fnB);
//install_command("#4", move(fnB));
fnA();
fnB();
for (const auto& p : commands) {
cout << p.first.c_str() << ": " << &p.second << endl;
}
}
int main() {
RunTest();
return 0;
}
程序用-std=c++11
编译,执行结果如下。
Function A.
Function B.
#1: 0xaf8088
#2: 0xaf8018
#3: 0xaf81a8
如果我取消注释该行install_command("#4", move(fnB));
,则会出现运行时错误。
terminate called after throwing an instance of 'std::bad_function_call'
what(): bad_function_call
Function A.
我相信 lambda 函数的所有权已从 function<void()> fnB
转移到 commands["#4"]
,但为什么fnA()
工作而fnB()
不起作用?
fnA
是一个常规函数,而不是std::function
fnB
当你这样做时
commands.insert({
std::move(name),
std::forward<ftor>(handler)
})
您创建
-
std::function<void()>
从void(&)()
fnA
-
std::function<void()>
从void(&)()
std::move(fnA)
- 从
std::function<void()>&
std::function<void()>
用于fnB
(因此复制构造函数( -
std::function<void()>
从std::function<void()>&&
std::move(fnB)
(因此移动构造函数(
只有后面修改输入参数。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗