这是代码示例:
#include <string>
#include <functional>
struct Foo {};
typedef bool func_type(Foo *&, const std::string&);
typedef std::function<bool(Foo*&, const std::string&)> FunctionalType;
bool f(Foo *, const std::string&)
{
}
int main()
{
#if 1
func_type *func;
func = f;
#else
FunctionalType f2;
f2 = f;
#endif
}
如您所见,我已将“对指针的引用”声明为第一个参数的函数类型 Foo *&
,我希望该函数仅以“指针”作为第一个参数 Foo *
不能分配给这种类型的变量。
#if 1
region 无法编译(如我所料);然而,替代方案没有发出任何错误:
FunctionalType f2;
f2 = f;
为什么编译没有错误(至少 gcc 5.2 和 clang 3.7)?
如何修复它,以便
std::function<Params>
不接受f
用于转换?
最佳答案
std::function<R(Ts...)>
被定义为一种类型,其对象可以表示可以使用参数调用的任何函数 Ts...
其返回值可转换为 R
.
因为你的功能f
可以用 T*
类型的左值调用作为第一个参数(这是你的 Foo *&
强加的要求),它是一个有效的函数,可以存储在你的 std::function
中。 .
据我所知,没有办法抑制这种行为。
关于c++ - std::function 签名指针 vs 指针引用 = 没有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33125972/