제네릭 코드로 반환 형식 전달
일반적으로 제공 한 초기 예제와 같이 제네릭이 아닌 코드의 경우 참조를 반환 유형으로 가져 오도록 수동으로 선택할 수 있습니다.
auto const& Example(int const& i)
{
return i;
}
그러나 일반 코드 에서는 참조 또는 값을 처리하는지 여부를 알지 못하면 반환 유형 을 완벽하게 전달할 수 있기를 원합니다 . decltype(auto)
당신에게 그 능력을 제공합니다 :
template<class Fun, class... Args>
decltype(auto) Example(Fun fun, Args&&... args)
{
return fun(std::forward<Args>(args)...);
}
재귀 템플릿에서 반환 유형 공제 지연
에서 이 Q & A 템플릿의 반환 유형으로 지정되었을 때 몇 일 전, 템플릿 인스턴스화하는 동안 무한 재귀가 발생했습니다 decltype(iter(Int<i-1>{}))
대신 decltype(auto)
.
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)
여기서 템플릿 인스턴스화 먼지가 발생한 후 리턴 유형 공제 를 지연시키는 데 사용됩니다 .
다른 용도
당신은 또한 사용할 수 있습니다 decltype(auto)
초안 표준 예, 다른 상황에서 N3936을 또한 상태를
7.1.6.4 자동 사양 [dcl.spec.auto]
1 auto
및 decltype(auto)
유형 지정자는 이니셜 라이저에서 추론하거나 후행 리턴 유형으로 명시 적으로 지정하여 나중에 대체 할 자리 표시 자 유형을 지정합니다. auto
형 SPECI 좋 어 또한 람다 일반 람다임을 나타 내기 위해 사용된다.
2 자리 표시 자 유형 은 선언자가 유효한 모든 컨텍스트에서 decl-specifier-seq, type-specifier-seq, conversion-function-id 또는 trailing-return-type에서 함수 선언자와 함께 나타날 수 있습니다 . 함수 선언자에 후행 반환 형식 (8.3.5)이 포함되어 있으면 선언 된 함수 반환 형식을 지정합니다. 함수의 선언 된 리턴 유형에 플레이스 홀더 유형이 포함 된 경우 함수 본문의 리턴 문에서 함수의 리턴 유형이 추론됩니다 (있는 경우).
초안에는 다음과 같은 변수 초기화 예제도 포함되어 있습니다.
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)