我可以typedef
返回std::bind
表达式的类型,但是显然编译器对我调用此类型的默认构造函数不满意。相反,我必须首先传递与我完全相同的参数std::bind
(请参见下文)。为什么?我做错了吗?
#include <iostream>
#include <functional>
#define x_plus_one(T) std::bind<T>( f_plus<T>(), std::placeholders::_1, T(1) )
template <class T>
struct f_plus
{
inline T operator() ( const T& a, const T& b ) const
{ return a + b; }
};
template <class T>
using x_plus_one_type = decltype( x_plus_one(T) );
int main()
{
auto f = x_plus_one(double);
std::cout<< f(3.2) << "\n";
// auto g = x_plus_one_type<double>(); ==> fails, no matching constructor
auto g = x_plus_one_type<double>( f_plus<double>(), std::placeholders::_1, 1 ); // but this works?!
std::cout<< g(3.2) << "\n";
}
我还尝试传递一个f_minus
函数对象,并交换占位符和1
,但是编译器不喜欢它,这确实使我感到困惑。唯一起作用的小“ hack”是替换1
which 2
,这告诉我无论返回的类型bind
是什么,它都不会复制输入。为什么不?有没有办法强制复制?
std::bind
未指定返回的类型。因此,未指定是否可以通过调用以外的任何方式来构造它std::bind
。您可以使用std::unique_ptr
或boost::optional
来具有非构造的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句