c++ - 为什么不对这些函数签名进行相同的处理?

标签 c++ function templates lambda function-pointers

我一定是误会了什么,因为我认为这两种情况是一样的:

#include <iostream>

    void function() { std::cout << "Hi\n"; }

    int main()
    {
        std::vector<void(*)()> funcPtrVec;
        std::vector<void()> funcVec;

        funcPtrVec.push_back(function); // Works 
        funcVec.push_back(function);    // Works

        auto lambdaFunc = []() { std::cout << "Hi\n"; };

        funcPtrVec.push_back(lambdaFunc);   // Works
        funcVec.push_back(lambdaFunc);      // Doesn't work

    }

现在,在这两种情况下,我的编译器都说函数签名是相同的,void function() 和 void lambdaFunc()。我真的认为,当 lambda 函数不捕获任何东西时,它的行为就像一个自由函数,相同的签名似乎支持它。此外,我想我更加困惑,因为在以下所有内容中似乎都被相同对待,就好像腐烂成同一件事:

void function() { std::cout << "Hi\n"; }

void funcTakingFunc(void()) {}
void funcTakingFuncPtr(void(*)()) {}

int main()
{
    auto lambdaFunc = []() { std::cout << "Hi\n"; };
    void(*funcPtr)() = lambdaFunc;  // Works

    funcTakingFuncPtr(lambdaFunc);  // Works
    funcTakingFuncPtr(funcPtr);     // Works
    funcTakingFunc(lambdaFunc);     // Works
    funcTakingFunc(funcPtr);        // Works
    // They all work
}

据我所知,函数和函数指针之间的唯一区别是作为 vector 的模板参数。这显然意味着我对模板的理解不是很好,但是这是什么原因呢?因为从我试过的例子来看,这两者真的很像。

最佳答案

std::vector<void()>不被允许;类型必须是对象类型,函数类型不是对象类型。

我们可以将 vector 要求规范的多个部分识别为被非对象类型违反;最明显的是默认分配器。在[allocator.requirements]/2 中的表中指定分配器所针对的类型必须是对象类型。

关于c++ - 为什么不对这些函数签名进行相同的处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374222/

相关文章:

c++ - 如何在 x64 Visual C++ 中执行裸函数和内联汇编程序

c++ - C++是否也保留标准库函数名?

c++ - 将成员函数作为模板参数传递

c++ - 在 C++ 中使用 if/then 语句解析 argv[ ] 选项

c++ - 为什么我的结构在包含字符串时崩溃?

c++ - ODR和内部链接

function - 元表如何工作以及它们的用途是什么?

c++ - 接受无限相同数量的 3 种类型的函数

javascript - 如何在我的网页上以漂亮的格式显示 JSON 对象?

c++ - 如何创建一个类,使 vector 起作用std::vector <MyClass <int >> v {1,2,3};