如何从由许多不可复制但可移动的结构体组成的队列中获取第一个结构体?

问题描述 投票:0回答:1

该结构包含一个

std::promise<std::any>
,因此它不能由复制构造函数构造。但即使我提供了 Move 构造函数和 move 分配器,它仍然无法正确运行。它报告了三个错误:

static assertion failed: result type must be constructible from input type

无法引用 函数 "test::test(const test &other)" (已声明 所在行数:19) -- 它是已删除的函数

use of deleted function 'test::test(const test&)'

重现代码:

#include <future>
#include <any>
#include <queue>

struct test{
    std::promise<std::any> p;

    test()=default;
    test(test&& other){
        p = std::move(other.p);
    }

    test& operator=(test&& other){
        p = std::move(other.p);
        return *this;
    }

    test& operator=(const test& other)=delete;
    test(const test& other)=delete;
};

test getFirst(std::queue<test> tests){
    test test = tests.front();
    tests.pop();
    return test;
}

int main(){
    test t;
    std::queue<test> tests;
    test t2 = getFirst(tests);
    return 0;
}
c++ struct promise queue
1个回答
1
投票
test getFirst(std::queue<test> &tests) {  // (1)
  test test = std::move(tests.front());   // (2)
  tests.pop();
  return test;
}

您的代码中有两个问题。

  1. 您通过副本获得了
    std::queue<test> tests
  2. tests.front()
    返回了可以移动的引用。
© www.soinside.com 2019 - 2024. All rights reserved.