stl 函数和函数类型 vs 函数指针类型

Gon*_*n I 3 c++ templates function-pointers

我试图了解函数类型<void()>和函数指针类型之间的区别<void (*)()>

stl::function可以通过 指向函数<void()>,但我似乎需要<void (*)()>在我自己的模板类中使用:

void f1() {
    std::cout << "hi!\n";
}
template<class T> struct X
{
    T t;
};
int main()
{
    std::function<void()> f = f1;  // stl handles this, and f is callable
    f(); // OK

    // X<void()> x; // compilation error - a member of a class template cannot aquire a function type

    X<void (*)()> x2;  // OK
    x2.t = f1;  // OK
    x2.t();  // OK

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

函数类型(例如<void()>C++ 11 的新功能)是否与std::function?

我已经看到了一些关于此的其他问题,但没有找到对我来说很清楚的解释,并且在网上搜索 C++ 函数类型并没有产生令人满意的结果。

我将不胜感激任何明确的解释或对一个的引用。

Die*_*ühl 6

函数类型对 C++11 来说根本不是新的:即使在 C 中也存在。但是,你不能拥有函数类型的对象,即,

template <typename T>
struct X {
    T t;
};

X<void()>    does_not_work;
X<void(*)()> works;
Run Code Online (Sandbox Code Playgroud)

但是,您可以将函数类型转换为指针类型:

template <typename T>
struct X {
    T* t;
};
Run Code Online (Sandbox Code Playgroud)

在使用与调用不同的函数时,该函数会衰减为函数指针。将函数衰减为指针等效于获取函数的地址。

当然,std::function<...>无论如何它是完全不同的:它实际上定义了一个函数调用运算符。为此,它设计了一个通用模板并将其专门用于函数类型:

template <typename> class function;
template <typename R, typename... A>
class function<R(A...)> {
public:
    R operator()(A...);
    // ...
};
Run Code Online (Sandbox Code Playgroud)