decltype(auto) 是否使尾随返回类型过时?
Does decltype(auto) make trailing return type obsolete?
关于尾随返回类型、auto
返回类型推导和非常有用的decltype(auto)
,已经有很多很多问题和答案。但是我找不到是否需要尾随返回类型的答案,因为我们有decltype(auto)
.是否存在尾随返回类型解决的情况,其中decltype(auto)
无法使用或不起作用(给出意外/不正确的结果(,并且首先需要尾随返回类型?
一个简单的例子是,在定义函数并推导出返回类型之前,你想调用函数:
decltype(auto) bar(); // doesn't help
decltype(auto) foo() { bar(); } // error: returned type of `bar` is unknown
decltype(auto) bar() { foo(); }
decltype(auto)
(以及更普遍的推导返回类型(和尾随返回类型是正交特征。
您可以拥有:
decltype(auto) f() {}
auto f() -> decltype(auto) {}
尾随返回类型
尾随返回类型很好,特别是可以访问我们在函数名称之前没有的上下文
-
至于模板:
template <typename T> auto f(T x) -> decltype(bar(x));
对
template <typename T> decltype(bar(std::declval<T&>())) f(T x);
-
或对于类中的从属名称:
auto C::begin() -> iterator;
对
C::iterator C::begin();
唯一需要它的地方是 lambda(如果您有/想要显式指定返回类型(:
[]() -> some_type {/*...*/}
[]() -> auto {/*...*/}
(相当于[]() {/*...*/}
([]() -> decltype(auto) {/*...*/}
我们必须定义 lambda 的返回类型的情况是它应该返回引用类型。
推导的返回类型
用decltype(auto)
和auto
完成.
decltype(auto)
和auto
演绎类型不同,主要表现为T&&
和T
。
推导的返回类型需要定义主体。
他们也不允许SFINAE,因为没有替代品。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 推导 std::vector::back() 的返回类型
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 基于返回类型的转换和过载扣除
- decltype(auto) 是否使尾随返回类型过时?