-
항목3. decltype의 작동 방식을 숙지하라Effective Modern C++ 2022. 7. 14. 20:16
decltype은 항상 변수나 표현식의 형식을 아무 수정 없이 보고한다.
const int i = 0; // decltype(i)는 const int Widget w; // decltype(w)는 Widget vector<int> v; if(v[0] == 0) ... // decltype(v[0]) 은 int&decltype을 이용한 함수 반환 형식 표현도 가능하다.
template<typename Container, typename Index> auto authAndAccess(Container& c, Index i) -> decltype(c[i]) { authenticateUser(); return c[i]; }template<typename Container, typename Index> decltype(auto) authAndAccess(Container& c, Index i) { authenticateUser(); return c[i]; }함수 반환 형식 auto에 decltype 사용하지 않는다면 형식 연역에 의하여 c[i]로부터 연역. (int& 에서 참조성을 무시해 int가 됨 ,즉 오른값이 됨.) 위의 형식은 오른값 컨테이너는 전달할 수 없다.
다음은 보편 참조 매개변수를 받도록 고친 방식이다
template<typename Container, typename Index> auto authAndAccess(Container&& c, Index i) -> decltype(std::forward<Container>(c)[i]) { authenticateUser(); return std::forward<Container>(c)[i]; }template<typename Container, typename Index> decltype(auto) authAndAccess(Container&& c, Index i) { authenticateUser(); return std::forward<Container>(c)[i]; }'Effective Modern C++' 카테고리의 다른 글
항목7. 객체 생성시 () 와 {} 를 구분하라 (0) 2022.07.19 항목5&6. auto를 선호하라 (0) 2022.07.17 항목4. 연역된 형식을 파악하는 방법 (0) 2022.07.14 항목2. auto 형식 연역 규칙을 숙지하라 (0) 2022.07.14 항목1.템블릿 형식 영역 규칙 (0) 2022.01.11