函数签名指针与指针引用=没有区别
std::function signature pointer vs pointer reference = no difference?
代码示例:
#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
区域编译失败(如我所料);但是,替代方法没有产生任何错误:
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
中的有效函数。
据我所知,没有办法抑制这个行为
std::function
是可调用对象的类型擦除容器。
它将存储任何c++类型的实例,这些实例可以被复制、销毁,并且可以用"兼容"签名调用。
本例中签名为bool(Foo*&, const std::string&)
。
核心思想是,当std::function
类型的R(Args...)
部分中的Args...
为Foo*&
, const std::string&
时,这些参数可以传递给期望Foo*
和const std::string&
的函数。
std::function
基于兼容性工作,而不是精确匹配签名。
如果你真的,真的需要禁止不接受引用的东西:
template<class T>
struct reference_only {
T& t;
operator T&(){ return t; }
operator T()=delete;
reference_only(T& tin):t(tin){}
};
然后使用:
typedef std::function<void(reference_only<Foo*>)> FunctionalType;
不喜欢被转换为值类型,但接受被转换为引用类型(在本例中为Foo*&
类型)。
实例编译,实例不编译
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在C++中释放内存期间,迭代器与指针有何不同
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 指针投射:指针有价值吗?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 在以下声明中使用指针有什么区别?
- C 中的通用指针和 C++ 中的通用指针有什么区别?
- 带"new"的指针和带"&variable"的指针有什么区别
- Boost 智能指针和 std 智能指针有什么区别?
- 数组的名称和指向第一个元素的另一个指针有什么区别
- 定义 char 和 int 时指针有什么区别
- std::thread constructor传递指针和通过引用传递有区别吗
- 这些存储指针数组的方法之间有区别吗
- c++中的自动指针和共享指针有什么区别?
- .get() 和 -> 之间有智能指针的区别吗?
- 在C++中,char 数组的名称和 char 指针有什么区别?
- c#中的委托和c++中的函数指针有什么区别
- 指针和分配了内存的指针有什么区别
- 使用指针和不使用指针"this"有区别吗?
- 全局指针和本地指针有什么区别?