为什么这些函数签名的处理方式不同?
Why aren't these function signatures treated the same?
我必须误解某些东西,因为我认为两种情况是相同的:
#include <iostream>
void function() { std::cout << "Hin"; }
int main()
{
std::vector<void(*)()> funcPtrVec;
std::vector<void()> funcVec;
funcPtrVec.push_back(function); // Works
funcVec.push_back(function); // Works
auto lambdaFunc = []() { std::cout << "Hin"; };
funcPtrVec.push_back(lambdaFunc); // Works
funcVec.push_back(lambdaFunc); // Doesn't work
}
现在,在这两种情况下,我的编译器都说函数签名是相同的,void函数()和void lambdafunc()。我真的认为,当lambda函数没有捕获任何表现就像自由功能一样,同一签名似乎支持。另外,我想我更加困惑,因为在下面的情况下,所有这些都被对待一样,就好像腐烂了同一件事:
void function() { std::cout << "Hin"; }
void funcTakingFunc(void()) {}
void funcTakingFuncPtr(void(*)()) {}
int main()
{
auto lambdaFunc = []() { std::cout << "Hin"; };
void(*funcPtr)() = lambdaFunc; // Works
funcTakingFuncPtr(lambdaFunc); // Works
funcTakingFuncPtr(funcPtr); // Works
funcTakingFunc(lambdaFunc); // Works
funcTakingFunc(funcPtr); // Works
// They all work
}
因此,据我所知,当函数和函数指针之间的唯一区别是作为模板参数与向量的模板参数时。这显然意味着我不太了解模板,但是这样做的原因是什么?因为我尝试过的示例确实看起来确实一样。
std::vector<void()>
不允许;该类型必须是对象类型,函数类型不是对象类型。
矢量要求的规范中有各种各样的部分,我们可以识别为非对象类型的侵犯;最明显的是默认分配器。在[salocator.requirement]/2的表中,指定分配器的类型必须是对象类型。
相关文章:
- 为什么这个信号处理程序不能捕获 SIGHUP 或 SIGQUIT?
- 构造函数中的错误处理而不会失败
- 我的控制台处理程序不处理 CTRL+C,即使设置正确
- 如何处理具有不同类的成员函数的函数查找表?
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 如果set_terminate中的处理程序不会流产,会发生什么
- 识别指针处理方式中的错误
- 信号处理程序不要求使用dlopen或dlclose
- 为什么在指针和数组的情况下,字符数组的处理方式不同
- 为什么这些函数签名的处理方式不同?
- 日食快捷方式不起作用
- G++ 和 boost 中 regex_replace() 替换字符串中''的不同处理方式
- SIGSEGV 信号处理程序不是从辅助线程 c++ 窗口调用的
- 常量标识符在C++中有不同的处理方式吗
- 在 C++ 中,get() 和 getline() 对换行符的处理方式不同
- 为什么这个简单的批处理方法不能按预期工作?
- 为什么Visual Studio在调试时对ANSI Escape代码有不同的处理方式
- 使用 EVT_NAVIGATION_KEY 处理事件不起作用
- 编辑控件的行为方式不该如此
- 构造 do while 循环以处理C++不起作用的帐号