하자 우리가 반환하는 함수가 있다고 가정 std::string
같은 복잡한 객체 :const auto & 함수 결과 저장 용으로 가치가 있습니까?
std::string find_path(const std::string& filename);
는 const auto&
에서 해당 메소드를 호출 한 결과를 저장하는 가치인가?
void do_sth() {
//...
const auto& path = find_path(filename);
//...
}
이런 종류의 접근 방식은 객체의 복사/이동을 방지합니다. 그래서 좋다. 그러나 반면에 auto
은 할당의 왼쪽을 통합하기 위해 도입되었습니다. CppCon2014의 프레젠테이션에서 Herb Sutter는 C++ 왼쪽에서 오른쪽으로 모던 한 스타일 https://www.youtube.com/watch?v=xnqTKD8uD64 (39 : 00-45 : 00)에 대해 언급합니다.
const 레퍼런스에서 std::string
을 저장하는 C++ 98에서는 괜찮 았습니다. C++ 11에서는 어떻게됩니까?
업데이트 (2016년 7월 27일 2:10 GMT + 0) :
죄송합니다, 내 질문은 정확하지 않았다. 나는 코딩 스타일을 의미했습니다. const &
을 추가하거나 auto
만 남겨두고 컴파일러에서 원하는대로 수행하도록하는 것이 더 좋습니다.
업데이트 된 예 :
unsigned int getTimout() { /* ... */ }
int getDepth() { /* ... */ }
std::string find_path(const std::string& filename,
unsigned int timeout,
int depth) { /* ... */ }
void open(const std::string& path) { /* ... */ }
두 가지 접근 방법 :
void do_sth() {
//...
auto timeout = getTimeout();
auto depth = getDepth();
const auto& path = find_path(filename, timeout, depth);
open(path)
//...
}
void do_sth() {
//...
auto timeout = getTimeout();
auto depth = getDepth();
auto path = find_path(filename, timeout, depth);
open(path);
//...
}
대 질문 :해야 우리
const auto&
을 사용하여 복잡한 반환 객체와- 을 사용하여 Herb가 자신의 프레젠테이션 (위 링크)에서 언급 한 왼쪽에서 오른쪽의 현대 C++ 스타일을 유지하는 모든 것에 대해 사용하십시오.
임시로 참조로 반환하지 마십시오 (함수 반환 값 가져 오기). –
NVRO에 대한 정보가 필요합니다. http://stackoverflow.com/questions/6233879/move-or-named-return-value-optimization-nrvo –
@ DieterLücking "C++은 의도적으로 임시 개체를 스택을 사용하면 임시의 수명이 참조 자체의 수명보다 길어집니다. " https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-most-important-const/ –