为什么const成员导致错误

Why const member caused error?

本文关键字:错误 成员 const 为什么      更新时间:2023-10-16
#include <vector>
class B {
};
class A {
const std::vector<B> m_v;
public:
A(const std::vector<B>& v) : m_v(v) {}
void doSomething() {}
};
void foo(void* bar) {
A* a = (A*)bar;
a->doSomething();
}
int main() {
std::vector<B> v;
std::vector<A > l;
for (auto i = 0; i < 10; i++) {
A a(v);
l.push_back(std::move(a));
foo((void*)&l[i]);
}
return 0;
}
$g++-Wall initList.cpp-o initList-lrt-O3-std=c++0x在/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../include/c++/4.6.2/vector:70:0中包含的文件中,来自initList.cpp:1:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:在成员函数\u2018void std::vector::_M_insert_aux(std::vector::迭代器,_Args&&…)[其中_Args={A},_Tp=A,_Alloc=std::分配器,std::向量::迭代程序=__gnu_cxx::__normal_iterator>,typename std::_vector_base::_Tp_Alloc_type::pointer=A*]`:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:102:4:从\u2018void std::vector::template_back(_Args&&…)实例化[其中_Args={A},_Tp=A,_Alloc=std::分配器]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_vector.h:840:9:从\u2018void std::vector::push_back(std::vector::value_type&&)实例化[其中_Tp=A,_Alloc=std::分配器,std::向量::value_type=A]`initList.cpp:23.27:从这里实例化//usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:319:4:error:使用删除的函数'&A::operator=(const A&)`initList.cpp:6:7:错误:"&A::operator=(const A&)"被隐式删除,因为默认定义格式不正确:initList.cpp:6:7:错误:将\u2018const std::vector`as\u2018this`\u2018std::vector&std::vector::operator=(const std::vector&)[with_Tp=B,_Alloc=std::allocator]`的参数传递为\u2018this'将丢弃限定符[-fpermission]在/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../include/c++/4.6.2/vector:61:0中包含的文件中,来自initList.cpp:1:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_algobase.h:在静态成员函数\u2018static_BI2 std::__copy_move_backward::__copy _move_b(_BI1,_BI1和_BI2)[其中_BI1=A*,_BI2=A*]`:/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/str_algobase.h:581:18:从\u2018_BI2 std::__copy_move_backward_a(_BI1,_BI1和_BI2)实例化[其中布尔_IsMove=true,_BI1=a*,_BI2=a*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/str_algobase.h:590:34:从\u2018_BI2 std::__copy_move_backward_a2(_BI1,_BI1和_BI2)实例化[其中布尔_IsMove=true,_BI1=A*,_BI2=A*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/str_algobase.h:661:15:从\u2018_BI2 std::move_backward(_BI1,_BI1和_BI2)实例化[其中_BI1=A*,_BI2=A*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:313:4:从\u2018void std::vector::_M_insert_aux(std::vector::迭代器,_Args&&…)实例化[其中_Args={A},_Tp=A,_Alloc=std::分配器,std::向量::迭代程序=__gnu_cxx::__normal_iterator>,类型名std::_vector_base::_Tp_Alloc_type::pointer=A*]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/vector.tcc:102:4:从\u2018void std::vector::template_back(_Args&&…)实例化[其中_Args={A},_Tp=A,_Alloc=std::分配器]`/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_vector.h:840:9:从\u2018void std::vector::push_back(std::vector::value_type&&)实例化[其中_Tp=A,_Alloc=std::分配器,std::向量::value_type=A]`initList.cpp:23.27:从这里实例化//usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../include/c++/4.6.2/bits/sstl_algobase.h:546:6:error:使用已删除的函数'&A::operator=(const A&)`

如果我不为m_v指定const。它编译得很好。

这个错误表明assign运算符有问题,我不知道它是如何调用的。

知道吗?

提前谢谢。

这是旧版本的GCC/libstdc++中的一个错误,您的代码可以用GCC 4.8.1编译得很好现场示例。错误由触发

l.push_back(std::move(a));

因为较旧版本的GCC试图在向量中创建默认构造的元素,并在第二步中将参数CCD_。