繁体   English   中英

字符串c ++操作

[英]String c++ manipulation

为什么以下代码有编译错误?

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str="abc";

    string result=str[0];
    cout<<result<<endl;
    return 0;
}

但是,以下代码工作正常:

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str="abc";

    str=str[0];
    cout<<str<<endl;
    return 0;
}

我在unix和编译命令中工作是:“g ++ -g test.cpp -std = c ++ 11 -oa”,thenm。/ a

编译后第一个test.cpp的错误是:

test.cpp:9:21: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
  string result=str[0];
                     ^
In file included from /usr/um/gcc-4.8.2/include/c++/4.8.2/string:52:0,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/bits/locale_classes.h:40,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/bits/ios_base.h:41,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/ios:42,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/ostream:38,
                 from /usr/um/gcc-4.8.2/include/c++/4.8.2/iostream:39,
                 from test.cpp:1:
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/basic_string.h:490:7: error:   initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' [-fpermissive]
       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
       ^

std::basic_string没有任何带有单个CharT参数的构造函数。 这意味着无法从单个char构造std::string (即std::basic_string<char> )。

但是,该类具有赋值运算符重载 ,该重载采用单个CharT参数,这就是您的第二个示例编译的原因。

两种情况之间的区别是因为在第一次执行复制初始化时 ,这意味着从技术上讲,您首先尝试从char参数构造临时std::string实例,然后将其复制到result 在第二个中,您正在执行赋值 ,这意味着为现有的std::string实例分配新值。


basic_string有一个构造函数,它接受一个字符后跟一个字符:

basic_string(size_type count, CharT ch, const Allocator& alloc = Allocator());

因此,如果您将违规行更改为,则您的原始示例将编译

string result = {1, str[0]};

以下代码也可以正常工作:

string result;
result=str[0];

这意味着初始化和简单赋值之间存在差异,如果检查错误:

error: invalid conversion from ‘char’ to ‘const char*’

应该明确的是,初始化不作为“全功能”的任务-在没有string构造函数,一个char参数( ,需要一个赋值char这就是为什么你的第二个例子工程)。

您可以通过确保使用字符串而不是字符进行初始化来修复它(在某种程度上,毫无疑问是其他人):

string result = str.substr(0,1);

str [0]返回一个char&,但是没有从char&到std :: string的转换

尝试变薄

string result = string(1, str[0]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM