在this question中,OP声称main
函数中的第三行正在将std::bind
的返回值转换为std::function
。
但是,它看起来像是一个简单的构造函数。
在没有构建新对象的情况下,是否有合法的方式<{>> std::bind
到std::function
的返回值?
或者,将std::bind
的返回值的地址强制转换为std::function*
然后通过引用它来调用它是犹太(不是未定义的行为)吗?
假设我知道std::function
的相应模板参数。也就是说,假设它们与我们从std::function
的返回值构造std::bind
的实例时使用的模板参数相同。
答案 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表达式。