이진 호환성에 대한 질문이 있습니다. 클래스 foo() 및 속성 문자열 _foo 공용 메서드가 포함되어 있습니다;바이너리 반환 유형 변경에 대한 호환 가능 C++
const string foo() {return _foo;}
나는 여전히 바이너리 호환
const string& foo(){return _foo;}
로 변경하면? 당신의 도움을 주셔서 감사합니다!
이진 호환성에 대한 질문이 있습니다. 클래스 foo() 및 속성 문자열 _foo 공용 메서드가 포함되어 있습니다;바이너리 반환 유형 변경에 대한 호환 가능 C++
const string foo() {return _foo;}
나는 여전히 바이너리 호환
const string& foo(){return _foo;}
로 변경하면? 당신의 도움을 주셔서 감사합니다!
본질적으로 같은 것을 할 것입니다 :
string s;
foo(&s);
당연히, 당신은을 변경하는 경우 : 컴파일러는 기계 코드를 생성 할 때
string s = foo();
의지가에 유사하게 나타납니다 반환 유형의 유형이 적절하지 않으면 s
에 대한 포인터를 적절하게 수정해야합니다. 따라서 반환 유형을 변경하고 바이너리 호환성을 유지할 수 없습니다 (함수의 서명이 변경됨에 따라 거의 컴파일되지 않을 것입니다 -> differnet mangled name -> "undefined reference").
: 크로스 플랫폼 C++ 코드를 작성할 때 여러 컴파일러로 컴파일 할 때 가장 제한적인 조건 집합을 나열하는 것이 목표입니다.
하는 것과하지 않는 :
... 당신은 할 수 없습니다 ... :
그것은 근처에도 아니에요의 반환 형식을 변경.
첫 번째 버전은 임시를 반환합니다. std::string
의 이동 생성자는 그 이동을 피할 수 있습니다. 두 번째 버전은 _foo
에 대한 참조를 반환하며이 위치에서 이동할 수 없습니다. 문자열의 복사본을 반환