C++ 中 std::vector存储const型对象报错

来源:互联网 发布:淘宝双十一打几折 编辑:程序博客网 时间:2024/05/21 18:41

今天在写c++程序时遇到了一个问题,声明了一个vector对象

std::vector<const std::string> str_vec;

结果程序编译报错:
这里写图片描述
此错误主要是vector中声明了const类型,此处vector<T>中的T应该是拷贝赋值的(CopyAssignable),因此不能使用const类型。

以下代码则会报上述错误

#include <iostream>    2 #include <vector>      3                        4 int main(){            5     std::vector<const std::string> str_vec;  6     std::string str1 = "hello";  7     std::string str2 = "world";  8     str_vec.emplace_back(str1);  9     str_vec.emplace_back(str2); 10     for (auto item : str_vec) { 11         std::cout << item << std::endl;                                                                                                                                                12     }                 13     return 0;         14 }                

若改成

#include <iostream>    2 #include <vector>      3                        4 int main(){            5     std::vector<std::string> str_vec;  6     std::string str1 = "hello";  7     std::string str2 = "world";  8     str_vec.emplace_back(str1);  9     str_vec.emplace_back(str2); 10     for (auto item : str_vec) { 11         std::cout << item << std::endl;                                                                                                                                                12     }                 13     return 0;         14 }                

则没有问题。
另外,若使用const指针是没有问题的,因为const指针是指向的对象不能改变,指针本身是可以拷贝,赋值的。即以下代码没有问题:

#include <iostream>    2 #include <vector>      3                        4 int main(){            5     std::vector<const std::string*> str_vec;  6     std::string str1 = "hello";  7     std::string str2 = "world";  8     str_vec.emplace_back(&str1);  9     str_vec.emplace_back(&str2); 10     for (auto item : str_vec) { 11         std::cout << *item << std::endl;                                                                                                                                                12     }                 13     return 0;         14 }                

另,我是在gcc编译器下编译的,网上有说vs编译器下没有问题。