我注意到std::string(真的std::basic_string是)移动赋值运算符是 noexcept.这对我来说很有意义.但后来我发现,没有一个标准集装箱(例如std::vector,std::deque,std::list,std::map)宣布其移动赋值操作符noexcept.这对我来说没什么意义.std::vector例如,A 通常实现为三个指针,并且指针当然可以移动分配而不会抛出异常.然后我想也许问题是移动容器的分配器,但std::string也有分配器,所以如果这是问题,我希望它会影响std::string.
那么为什么std::string移动赋值运算符noexcept,但标准容器的移动赋值运算符不是?
我有一个类(Uniform),它有一个带有2个参数的构造函数,以及一个默认的复制构造函数(它只包含int,float,std :: vector和std :: map).我创造了一个
std::vector<Uniform> uniforms
Run Code Online (Sandbox Code Playgroud)
我想填写使用
uniforms.push_back()
Run Code Online (Sandbox Code Playgroud)
线.我使用此代码来执行此操作(第二行仅用于测试复制构造函数,因为它当前失败)
Uniform uni(uniform_name,type);
Uniform uni2=uni;
uniforms.push_back(uni2);
Run Code Online (Sandbox Code Playgroud)
默认构造函数工作正常,"uni2 = uni"编译没有问题(因此默认的复制构造函数也可以),但push_back返回(使用g ++作为编译器):
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../include/c++/4.6.0/ext/new_allocator.h:108:9:erreur :没有匹配函数调用'Uniform :: Uniform(const Uniform&)'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../include/c++/4.6.0/ext/new_allocator.h:108:9:注意:候选人是:
./inc/uniform.h:16:5:注意:Uniform :: Uniform(std :: string,Uniform_Type)
./inc/uniform.h:16:5:注意:候选人需要2个参数,1个提供
./inc/uniform.h:14:7:注意:Uniform :: Uniform(Uniform&)
./inc/uniform.h:14:7:注意:参数1从'const Uniform'到'Uniform&'没有已知的转换
谢谢 :)