为什么我不能将字符串::赋回字符串?

Why I can't assign string::back to string?

本文关键字:字符串 为什么 不能      更新时间:2023-10-16

我写一个简单的程序: 获取字符串 1 的最后一个字符并将其分配给字符串 2。 就像:

#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没有只接受单个字符参数的隐式构造函数,这就是从charstd::string的转换失败的原因。相反,您可以使用:

// 1. Constructor with length + char
std::string s2(1, s1.back());
// 2. Constructor which takes an std::initializer_list<char>
std::string s2{s1.back()};

字符串是字符的集合,字符串的背面是一个字符(即,只是集合的一个元素(,而不是字符串。

您可以使用以下构造函数重载来实现所需的std::string

std::string s2(1, s1.back());

也就是说,将s2构造为一个字符长度的字符串,值为s1.back()

希望您正在尝试从字符串 s2 的最后一个字符创建一个新的字符串 s1。 您可以使用以下解决方案实现这一点:

#include<iostream>
#include<string>
int main()
{
std::string s1 = "abc!";
std::string s2;
s2 = s1.back();
std::cout << s1;
std::cout << s2;
return 0;
}