是否有可能在不构造的情况下将std :: bind的返回值实际转换为std :: function?

时间:2016-05-16 07:32:52

标签: c++ c++11 casting stl

this question中,OP声称main函数中的第三行正在将std::bind的返回值转换为std::function

但是,它看起来像是一个简单的构造函数。

在没有构建新对象的情况下,是否有合法的方式<{>> std::bindstd::function的返回值?

或者,将std::bind的返回值的地址强制转换为std::function*然后通过引用它来调用它是犹太(不是未定义的行为)吗?

假设我知道std::function的相应模板参数。也就是说,假设它们与我们从std::function的返回值构造std::bind的实例时使用的模板参数相同。

2 个答案:

答案 0 :(得分:2)

标准称这是带功能表示法的显式类型转换。本质上,它用于构造指定类型的值。虽然它可能看起来像构造函数调用,但实际上没有办法在C ++中直接调用构造函数。

  

在不构造新对象的情况下,是否有合法的方法将std :: bind的返回值实际转换为std :: function?

没有。返回类型std::bind未指定;它可以返回任何东西,只要它提供正确的操作和语义。您无法以便携方式将其视为std::function

  

或者,将std :: bind的返回值的地址强制转换为std :: function *然后通过引用它来调用它是kosher(不是未定义的行为)吗?

不,这是未定义的行为。

答案 1 :(得分:0)

std::bind表达式的类型与std::function类型不同。在某些情况下,它甚至无法转换为std::function。所以,不,你不能在不构造的情况下将绑定对象强制转换为std::function。但编译器可以允许隐式转换。

同样适用于lambda表达式。