>백엔드 개발 >C++ >C에서 `decltype(auto)`의 실제 적용은 무엇입니까?

C에서 `decltype(auto)`의 실제 적용은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-10 06:03:16508검색

What are the practical applications of `decltype(auto)` in C  ?

decltype(auto)의 용도는 무엇입니까?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.