【问题标题】:Can the type returned by std::bind be default-constructed?std::bind 返回的类型可以默认构造吗?
【发布时间】:2015-02-08 13:40:25
【问题描述】:

我可以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 哪个2,它告诉我无论bind 返回的类型是什么,它都不会复制输入。为什么不?有没有办法强制复制?

【问题讨论】:

    标签: c++ c++11 bind typedef default-constructor


    【解决方案1】:

    std::bind 返回的类型未指定。因此,未指定是否可以通过调用std::bind 以外的任何方式构造它。您可以使用std::unique_ptrboost::optional 来获得未构造的值。

    【讨论】:

    • 嗯,这并不理想,但我想这是正确的答案,谢谢。
    猜你喜欢
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2020-11-12
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多