为啥我不能将 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,它只接受一个字符参数,这就是从charstd::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=,它需要一个 charstd::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 分配给字符串?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将具有用户定义参数的方法分配给 c# 中的按钮?

为啥我不能将 UIView 分配给 self.view?

为啥我可以将字符分配给字符串对象而不是字符串对象的向量?

简单的 Python 问题:为啥我不能将变量分配给排序列表(就地)? [复制]

为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?

为啥类型不能分配给泛型类型