gpt4 book ai didi

c++ - 为什么我可以将字符分配给字符串对象而不是字符串对象的 vector ?

转载 作者:行者123 更新时间:2023-12-01 08:51:22 24 4
gpt4 key购买 nike

C++ Primer 说字符和字符串文字可以转换为 string s。
我尝试为 string 分配一个字符作为:

std::string s;
s = 's';
它没有给我任何错误。
但是,当我尝试将字符分配给 vector 时的 string s 对象为:
std::vector<std::string> svec;
svec = {'a', 'b'};
它给了我一个错误。为什么?

最佳答案

C++ Primer says that character and string literals may be converted to strings.


C 风格的字符串文字可以转换为 std::string隐含地,但 char不能。这与任务不同。 s = 's';有效是因为 std::string有一个过载 operator= 服用 char .
  1. Replaces the contents with character ch as if by assign(std::addressof(ch), 1)
svec = {'a', 'b'};不起作用,因为 std::vector只有重载 operator= s服用 std::vectorstd::initializer_list , 它们都不能从支撑初始化列表 {'a', 'b'} 构建.您可能会认为重载 std::initializer_list<std::string>可以用于这种情况,但 char无法转换为 std::string隐式( std::string 没有这样的 converting constructor 取一个 char ),然后 std::initializer_list<std::string>未能从 {'a', 'b'} 构建.
作为解决方法,您可以将代码更改为
svec = {"a", "b"};
"a"类型为 const char[2]和衰变 const char* ,可以转换为 std::string隐式(通过 std::string 's converting constructorconst char* ),然后 std::initializer_list<std::string>{"a", "b"} 构建并传递给 std::vector::operator= .当然 svec = {std::string("a"), std::string("b")}; (或 svec = {"a"s, "b"s};)也有效, std::initializer_list<std::string>将直接构造,而不进行这种隐式转换为 std::string .

关于c++ - 为什么我可以将字符分配给字符串对象而不是字符串对象的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62573416/

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