此处已明确标记为"未来"已删除

'future' has been explicitly marked deleted here

本文关键字:删除 未来 记为      更新时间:2023-10-16

我正在尝试构建一个异步应用程序以允许并行处理大型列表,经过两天的谷歌搜索学习C++,我从以下代码中发现了标题错误:

//
//  main.cpp
//  ThreadedLearning
//
//  Created by Andy Kirk on 19/01/2016.
//  Copyright © 2016 Andy Kirk. All rights reserved.
//
#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
#include <future>
typedef struct {
    long    mailing_id;
    char    emailAddress[100];
} emailStruct ;
typedef struct {
    long    mailing_id = 0;
    int     result = 0;
} returnValues;
returnValues work(emailStruct eMail) {
    returnValues result;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    result.mailing_id = eMail.mailing_id;
    return result;
}
int main(int argc, const char * argv[]) {
    std::vector<emailStruct>    Emails;
    emailStruct eMail;
    // Create a Dummy Structure Vector
    for (int i = 0 ; i < 100 ; ++i) {
        std::snprintf(eMail.emailAddress,sizeof(eMail.emailAddress),"user-%d@email_domain.tld",i);
        eMail.mailing_id = i;
        Emails.push_back(eMail);
    }

    std::vector<std::future<returnValues>> workers;
    int worker_count = 0;
    int max_workers  = 11;

    for ( ; worker_count < Emails.size(); worker_count += max_workers ){
        workers.clear();
        for (int inner_count = 0 ; inner_count < max_workers ; ++inner_count) {
            int entry = worker_count + inner_count;
            if(entry < Emails.size()) {
                emailStruct workItem = Emails[entry];
                auto fut = std::async(&work, workItem);
                workers.push_back(fut);
            }
        }
        std::for_each(workers.begin(), workers.end(), [](std::future<returnValues> & res) {
            res.get();
        });
    }
    return 0;
}

真的不知道我做错了什么,并且找到了有限的答案搜索。 如果相关的话,它在OSX 10和XCode 7上。

future类删除了其复制构造函数,因为您真的不想拥有它的多个副本。

要将其添加到向量中,您必须移动它而不是复制它:

workers.push_back(std::move(fut));

如果要将未来对象(在线程内)传递给需要按值传递的函数,也会引发此错误。

例如,当您通过未来时,这将引发错误:

void multiplyForever(int x, int y, std::future<void> exit_future);
multiplyForever(3, 5, fut);

您可以通过引用传递未来来修复它:

void multiplyForever(int x, int y, std::future<void>& exit_future);
multiplyForever(3, 5, fut);