首页 > 解决方案 > 为什么 std::function 接受不匹配的签名

问题描述

考虑一下:

#include <functional>
#include <type_traits>

void foo(std::function<void(double)>) {}

template <typename T>
struct S {
    T function;
};

int main() {
    auto f = std::function<bool(double)>([](double) { return true; });
    foo(f);

    S<std::function<void(double)>> s;
    s.function = f;

    static_assert(std::is_same_v<decltype(f), std::function<void(double)>>);
}

演示

为什么foo(f)可以使用不同的函数类型进行调用?

断言说它们不一样,但为foo.

这里的转换规则是什么?

如果 struct可以分配一个不匹配的函数S,我该怎么办?s.function = f

有没有办法在编译时避免这个赋值,只允许精确匹配的类型?

标签: c++implicit-conversionstd-function

解决方案


推荐阅读