C 14의 decltype(auto) 관용구는 다음과 같은 추론을 허용합니다. 주어진 표현식의 변수 유형. 기본 용도는 자동 선언이 decltype 규칙을 준수하도록 하는 것이지만 이 기능에 대한 다른 여러 가지 유용한 응용 프로그램도 있습니다.
일반 코드 내에서는 반환 값이 참조인지 값인지에 대한 사전 지식 없이 반환 유형을 완벽하게 전달하는 것이 중요합니다. decltype(auto)은 다음 기능을 제공합니다.
template<class Fun, class... Args> decltype(auto) Example(Fun fun, Args&&... args) { return fun(std::forward<Args>(args)...); }
재귀 템플릿을 정의할 때 인스턴스화 중 무한 재귀가 발생할 수 있습니다. 반환 유형이 decltype(auto) 대신 decltype(...)으로 선언된 경우. 후자는 템플릿 인스턴스화 이후까지 반환 유형 추론을 지연할 수 있습니다.
template<int i> struct Int {}; constexpr auto iter(Int<0>) -> Int<0>; template<int i> constexpr auto iter(Int<i>) -> decltype(auto) { return iter(Int<i-1>{}); } int main() { decltype(iter(Int<10>{})) a; }
decltype(auto)은 다양한 다른 컨텍스트에서도 활용할 수 있습니다. , 변수 초기화 포함:
int i; int&& f(); auto x3a = i; // decltype(x3a) is int decltype(auto) x3d = i; // decltype(x3d) is int auto x4a = (i); // decltype(x4a) is int decltype(auto) x4d = (i); // decltype(x4d) is int& auto x5a = f(); // decltype(x5a) is int decltype(auto) x5d = f(); // decltype(x5d) is int&& auto x6a = { 1, 2 }; // decltype(x6a) is std::initializer_list<int> decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression auto *x7a = &i; // decltype(x7a) is int* decltype(auto)*x7d = &i; // error, declared type is not plain decltype(auto)
위 내용은 C에서 `decltype(auto)`의 실제 적용은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!