编译vector<char*>初始化代码遇C2440错误,求解决方案
为什么
vector<char*>初始化字符串字面量会报错? 你遇到的这个问题本质是C++里字符串字面量的类型限制导致的,咱们一步步拆解:
错误原因
字符串字面量(比如"a"、"an")在C++中的实际类型是const char[],它会隐式转换为const char*——这是因为字符串字面量是存储在只读内存区域的,程序不能修改它们的内容。
而你声明的vector<char*>要求元素是可修改的字符指针,C++不允许把const char*隐式转换成char*(这是一种安全保护,防止你通过char*去修改只读的字符串字面量,触发未定义行为)。编译器找不到能把const char*的初始化列表转换成vector<char*>的构造函数,所以就抛出了C2440这个错误。
为什么改成vector<const char*>就正常了?
当你把vector的元素类型改成const char*后,初始化列表里的元素类型(const char*)和vector的元素类型完全匹配,vector的初始化构造函数可以直接接收这个列表,自然就能编译通过了。
更推荐的写法
如果你的场景需要对字符串进行修改,或者想避免指针操作的麻烦,更推荐使用std::string来代替字符指针:
vector<std::string> art = { "a","an","the" };
std::string会自动管理内存,支持各种字符串操作,比直接用const char*或char*更安全也更易用。
内容的提问来源于stack exchange,提问作者gaofeng




