【发布时间】:2019-01-14 23:26:11
【问题描述】:
我在玩 function pointers vs. std::function 并遇到了以下问题。
让我们考虑以下代码:
#include <cmath>
#include <functional>
// g++ -std=c++17 SF.C -o SF
// clang++ -std=c++17 SF.C -o SF
int main()
{
typedef double (*TpFunctionPointer)(double) ;
TpFunctionPointer pf1 = sin; // o.k.
TpFunctionPointer pf2 = std::sin; // o.k
TpFunctionPointer pf3 = std::riemann_zeta; // o.k
std::function< double(double) > sf1( sin ); // o.k
std::function< double(double) > sf2( std::sin ); // fails
std::function< double(double) > sf3( std::riemann_zeta ); // fails
}
使用g++ v8.2 或clang v7.0 编译对函数指针 pf1、pf2、pf3 和 sf1 效果很好。
但是对于 sf2 和 sf3 我会收到相当长的错误消息,例如:
SF.C:17:47: error: no matching function for call to ‘std::function<double(double)>::function(<unresolved overloaded function type>)’
std::function< double(double)> sf2( std::sin ); // fails
这是预期的行为吗?sf2 和 sf3 不应该没问题吗?
【问题讨论】:
-
实际上,即使是第一个对我来说也失败了(因此现在不是答案 + LRIO 所说的)
-
有趣的是,这与几秒钟前提出的问题非常相关:stackoverflow.com/questions/54182502/…
-
不同之处在于
std::function的构造函数是模板化的,所以编译器没有上下文来推断重载。 -
更有趣的是
double (*pf4)(double) = static_cast<float (*)(float)>(std::sin);不编译,但std::function<double(double)> sf4 (static_cast<float (*)(float)>(std::sin));可以。 -
@molbdnilo 在我的脑海中,我不记得这是多么明确。我的直觉告诉我这是一个“编译但不合法”的案例,但我几乎会把钱花在它是深奥的正确上。无论哪种方式都是不使用它的好理由 IMO!