2013-10-04 2 views
5

이진 호환성에 대한 질문이 있습니다. 클래스 foo() 및 속성 문자열 _foo 공용 메서드가 포함되어 있습니다;바이너리 반환 유형 변경에 대한 호환 가능 C++

const string foo() {return _foo;} 

나는 여전히 바이너리 호환

const string& foo(){return _foo;} 

로 변경하면? 당신의 도움을 주셔서 감사합니다!

답변

2

본질적으로 같은 것을 할 것입니다 :

string s; 
foo(&s); 

당연히, 당신은을 변경하는 경우 : 컴파일러는 기계 코드를 생성 할 때

string s = foo(); 

의지가에 유사하게 나타납니다 반환 유형의 유형이 적절하지 않으면 s에 대한 포인터를 적절하게 수정해야합니다. 따라서 반환 유형을 변경하고 바이너리 호환성을 유지할 수 없습니다 (함수의 서명이 변경됨에 따라 거의 컴파일되지 않을 것입니다 -> differnet mangled name -> "undefined reference").

7

: 크로스 플랫폼 C++ 코드를 작성할 때 여러 컴파일러로 컴파일 할 때 가장 제한적인 조건 집합을 나열하는 것이 목표입니다.

하는 것과하지 않는 :
... 당신은 할 수 없습니다 ... :

  • 어떤 식 으로든
1

그것은 근처에도 아니에요의 반환 형식을 변경.

첫 번째 버전은 임시를 반환합니다. std::string의 이동 생성자는 그 이동을 피할 수 있습니다. 두 번째 버전은 _foo에 대한 참조를 반환하며이 위치에서 이동할 수 없습니다. 문자열의 복사본을 반환