2014-10-02 1 views
0

변수 문자열로 지정하지 않고 참조로 함수에 반환 된 문자열을 전달 :내가 함수로 정의

void func(string & str_alias) 
{...} 

그리고 내 주요 기능에

int main() 
{ 
    string a; 
    func((a="Cat said: ")+"Meow"); 
} 

컴파일러는보고 것이라고 나는에 주요 기능을 변경하면 내가 알고 있지만

no known conversion for argument 1 from ‘std::basic_string<char>’ to ‘std::string& {aka std::basic_string<char>&}’ 

:

int main() 
{ 
    string a; 
    func(a=((a="Cat said: ")+"Meow")); 
} 

코드가 문제없이 통과합니다. 하지만 여전히 반환 된 문자열을 참조로 함수에 전달할 수없는 이유가 궁금합니다. 왜 다른 문자열 변수에 할당해야합니까?

감사합니다.

+2

'std :: string :: operator ='는 스트림에 대한 참조를 반환합니다. 'std :: string :: operator +'는 결과 연결의 복사본을 반환합니다. 이 복사본은 rvalue이며 lvalue-reference에 바인딩 할 수 없습니다. – 0x499602D2

+0

"stream"이라고 말하면 나는 "string"을 의미했습니다. 그리고 lvalue-reference는 const가 아닌 lvalue-reference를 의미합니다. 왜냐하면 rvalue가 const lvalue-reference에 실제로 바인딩 될 수 있기 때문입니다. – 0x499602D2

답변

1

std :: string에 대한 const 참조를 만들려면 컴파일해야합니다.

이것은 첫 번째 함수 호출에서 마지막으로 수행 한 작업이 std::string operator+(const std::string&, const char*)입니다.이 호출은 참조가 아닌 std :: string을 반환하며 아무 곳에도 저장되지 않으므로 rvalue가 될 수 없습니다. lvalue-reference에 바인딩됩니다.

두 번째 예제는 컴파일 할 때 사용합니다. 마지막으로 수행 할 작업은 변수 a에 할당되는 것이므로 std::string& operator=(const char*)을 호출합니다. 반환 참조에서 볼 수 있듯이이 코드는 비 const 참조로 사용할 수 있습니다.

0x499602D2 덕분에 수정되었습니다.

+0

고마워 ~ 나는 평범한 것에 대해 조금 읽어야한다고 생각한다. :) – Chong

3

만큼 당신은

쉽게

void func(const string & str_alias) 
     // ^^^^^ 
{...} 

에 함수 서명을 변경하여이를 방지하고 단순히

func(string("Cat said: ") + "Meow"); 

(live demo 참조) 부를 수있는, 전달 된 참조를 변경할 필요가 없습니다

참조 매개 변수를 변경해야하는 경우 수정해야 할 lvalue가 있어야합니다. 그럼에도 불구하고 글을 쓰는 것은

func(a=string("Cat said: ")+"Meow"); 

이면 충분합니다 (live demo 참조).

+0

"Cat은 말했습니다 :"+ "Meow"는 컴파일을하지 않습니다. 왜냐하면 내가 아는 한 2 개의 const char *에 대한 연산자가 없기 때문입니다. 내가 틀렸다면 나를 바로 잡으십시오. – Creris

+0

@TheOne이 수정되었습니다. –

+0

감사합니다, 나는 가치를 알지 못했습니다. – Chong

관련 문제