c++ - std::function 签名指针 vs 指针引用 = 没有区别?

标签 c++ function pointers c++11

这是代码示例:

 #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;
  1. 为什么编译没有错误(至少 gcc 5.2 和 clang 3.7)?

  2. 如何修复它,以便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/

相关文章:

c++ - 按值返回和按常量引用传递时避免临时构造

c++ - 使用互斥量的正确方法

c - C中的MACRO执行步骤

c++ 使用 const char* 参数类型调用函数的最佳方法

c++ - 地址、reinterpret_cast 和多重继承

go - Golang中的指针地址

c - delete tail 不返回正确的列表

c++ - 在这里返回临时地址是未定义的行为吗?

c++ - 将 double 组转换为仅具有 double 成员的结构数组而不复制数据

javascript - JS 函数就这么简单,超链接语法