创建 std::vector 时,“结果类型必须可从输入范围的值类型构造”

Mag*_*gix 2 c++ compiler-errors initialization vector move-semantics

我有一个看起来像这样的班级成员

class Controller {
    protected:
    // other stuff
    std::vector<Task<event_t, stackDepth>> taskHandlers; 

    //some more stuf
}
Run Code Online (Sandbox Code Playgroud)

Task班是不可缺省构造,非可复制构造,非copyAssignable但moveConstructible和moveAssignable。我可以阅读的所有内容(特别是std::vector文档)使我认为这应该可以编译,但错误列表如下所示(此处为完整输出):

/usr/include/c++/9/bits/stl_uninitialized.h:127:72: error: static assertion failed: result type must be constructible from value type of input range
  127 |       static_assert(is_constructible<_ValueType2, decltype(*__first)>::value,
      |                                                                        ^~~~~
Run Code Online (Sandbox Code Playgroud)

使TaskdefaultConstructible 没有帮助。错误指向类的定义Controller。我在 c++17 模式下使用 GCC 9.3.0。我做错了什么吗?

dar*_*une 8

根据当前的信息,我最好的猜测是您以某种方式弄乱了移动构造函数的语法-仅使用emplace_back以下示例即可:

下面编译正常,链接到 Godbolt

#include <vector>

class X
{
public:
    X(int i) : i_(i){}
    X() = delete;
    X(const X&) = delete;
    X(X&&) = default;//change this to 'delete' will give a similar compiler error
private:
    int i_;
};


int main() { 
    std::vector<X> x;
    x.emplace_back(5);
}
Run Code Online (Sandbox Code Playgroud)