为啥我不能将 string::back 分配给字符串?
Posted
技术标签:
【中文标题】为啥我不能将 string::back 分配给字符串?【英文标题】:Why I can't assign string::back to string?为什么我不能将 string::back 分配给字符串? 【发布时间】:2018-10-20 19:10:39 【问题描述】:我写了一个简单的程序: 获取 string1 的最后一个字符并将其分配给 string2。 就像:
#include<iostream>
#include<string>
int main(int argc, char const *argv[])
std::string s1 = "abc!";
std::string s2 = s1.back();
std::cout << s1;
return 0;
但是,我得到一个编译错误:
conversion from ‘__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type aka char’ to non-scalar type ‘std::__cxx11::string aka std::__cxx11::basic_string<char>’ requested
我不知道这个错误的确切含义。 似乎发生了一些类型转换错误。 但是string::back的返回值应该是char吧?
为什么我不能将它分配给另一个字符串? 以及如何将 s1 的最后一个字符赋予 s2?
【问题讨论】:
字符串是一个字符序列。一个字符不是字符串。 ^ 这正是错误信息的原因。 附带说明,std::string s1 = something;
不是赋值,而是copy initialization。
【参考方案1】:
这是因为std::string
没有隐含的constructor,它只接受一个字符参数,这就是从char
到std::string
的转换失败的原因。相反,您可以使用:
// 1. Constructor with length + char
std::string s2(1, s1.back());
// 2. Constructor which takes an std::initializer_list<char>
std::string s2s1.back();
【讨论】:
不过,它确实有一个operator=
,它需要一个 char
:std::string s2; s2 = s1.back();
这个答案会更有用,如果它可以解释,OP 不是在做分配,而是copy initialization。这将导致声明,即只考虑隐式构造函数。【参考方案2】:
字符串是字符的集合,字符串的后面是字符(即只是集合的一个元素),而不是字符串。
您可以通过使用std::string
的以下构造函数重载来实现您想要的:
std::string s2(1, s1.back());
也就是说,将s2
构造为一个长度为一个字符的字符串,其值为s1.back()
。
【讨论】:
【参考方案3】:希望您尝试从字符串 s1 的最后一个字符创建一个新的字符串 s2。 您可以使用以下解决方案来实现:
#include<iostream>
#include<string>
int main()
std::string s1 = "abc!";
std::string s2;
s2 = s1.back();
std::cout << s1;
std::cout << s2;
return 0;
【讨论】:
或者改用operator=
:std::string s2; s2 = s1.back();
以上是关于为啥我不能将 string::back 分配给字符串?的主要内容,如果未能解决你的问题,请参考以下文章
简单的 Python 问题:为啥我不能将变量分配给排序列表(就地)? [复制]