У меня есть два вопроса о строках C++:
string func(string & s)
выражения string func(string & s)
работает аналогично string & func(string & s)
, но как вы определяете, является ли возвращаемое значение ссылочным или нереляционным?func((string)str)
?
Код выглядит следующим образом, включая комментарии, показывающие мое намерение с вопросами 1 и 2:
#include <iostream>
#include <string>
using namespace std;
//Q1:string func(string & s){
string & func(string & s){
s[2]='S';
return s;
}
int main(){
char str[]={'H','H','H','H'};
string name="HHHHH";
//Q2:string tmp=(string)str;
//string rest=func(tmp);
string rest=func((string)str);
cout<<"rest"<<rest;
}
Q1: Возвращает string&
возвращает ссылку на исходную строку. Возвращаемая string
возвращает копию исходной строки. Кроме того, возвращающая string&
делает выражение функции функцией lvalue, тогда как возвращающая string
делает ее rvalue.
Q2: (string)str
создает временную std::string
инициализированную с str
. Поэтому это rvalue. Но func
ожидает, что его аргумент будет lvalue, так как параметр является ссылкой non- const
lvalue.
char str[] = { 'H', 'H', 'H', 'H' }
- это массив из четырех символов, а не C-строка. C-строки заканчиваются нулевым байтом, эквивалентнымchar str[] = { 'H', 'H', 'H', H', 0 /* or '\0' */ };
илиchar str[] = "HHHH";