小编Mar*_*dil的帖子

C++ 11将函数作为lambda参数传递

最近,我遇到了一个奇怪的问题,即将作为参数传递的函数传递给lambda表达式.使用clang 3.5+编译的代码很好,但是使用g ++ 5.3失败了,我想知道问题是在c ++标准中,clang中的非标准扩展,还是GCC中的无效语法解释.

示例代码很简单:

    template<typename Fn, typename... Args, typename T = typename std::result_of<Fn(Args...)>::type>
    std::future<T>
    async(Fn &&fn, Args &&... args)
    {
        std::shared_ptr<std::promise<T>> promise = std::make_shared<std::promise<T>>();
        auto lambda = [promise, fn, args...](void)
            { promise->set_value(fn(std::move(args)...)); };
        send_message(std::make_shared<post_call>(lambda));
        return promise->get_future();
    };
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会报告如下:

error: variable ‘fn’ has function type
             { promise->set_value(fn(std::move(args)...)); };
(...)
error: field ‘async(Fn&&, Args&& ...) [with Fn = int (&)(int, int); Args = {int&, int&}; T = int]::<lambda()>::<fn capture>’ invalidly declared function type
         auto lambda = [promise, fn, args...](void)
Run Code Online (Sandbox Code Playgroud)

幸运的是,我找到了一个简单的解决方法,添加了一个std …

c++ gcc clang c++11 clang++

9
推荐指数
1
解决办法
1742
查看次数

标签 统计

c++ ×1

c++11 ×1

clang ×1

clang++ ×1

gcc ×1