[英]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.