gpt4 book ai didi

c++ - 默认构造函数阻止调用 emplace_back

转载 作者:IT老高 更新时间:2023-10-28 21:53:05 25 4
gpt4 key购买 nike

似乎添加默认构造函数会阻止调用 emplace_back 并产生错误消息:“静态断言失败:类型不可分配”(gcc 5.3 with -std=c++14)。这是一个说明问题的简单代码:

class A {
public:
int a;
A() = default;
A(int a) {
this->a = a;
}
A(A const & a) = delete;
A& operator =(A const & a) = delete;
A(A && a) = default;
A& operator =(A && a) = default;
};

int main() {

A a(4);
std::vector<A> vec;
vec.emplace_back(std::move(a)); // Error: type is not assignable
return 0;
}

当删除默认构造函数时,错误消失了!此外,如果定义了默认构造函数(即使它什么都不做),错误也会消失:

class A {
public:
int a;
A() {
}
A(int a) {
this->a = a;
}
A(A const & a) = delete;
A& operator =(A const & a) = delete;
A(A && a) = default;
A& operator =(A && a) = default;
};

int main() {

A b;
A a(4);
std::vector<A> vec;
vec.emplace_back(std::move(a)); // Error gone
return 0;
}

似乎 "A() = default;"是导致问题的原因。这是编译器的一部分的正常行为还是一个错误?

最佳答案

这是一个 libstdc++ 错误(编辑:报告为 bug 69478)。

简而言之,libstdc++ 的 std::vector 与此处相关,使用 std::uninitialized_copy(与移动迭代器配对)在重新分配时移动元素,这被简化为std::copy 如果类型是平凡的并且迭代器的引用类型是可赋值的(即,在概念上将使用的赋值运算符是可用的)。

然后,用于指向普通类型的指针的 std::copy(或者在我们的例子中,包装指针的 move_iterator)依次被优化为对 memmove 加上对 is_copy_assignable 的检查。当然,在这种情况下,检查是错误的,因为 uninitialized_copy 与移动迭代器配对,只要求事物是可移动构造的。

如果您没有默认构造函数或者默认构造函数是用户定义的,那么该类就不是微不足道的,因此您不会点击触发此错误的代码路径。

关于c++ - 默认构造函数阻止调用 emplace_back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35002402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com