Fur*_*ish 3 c++ trailing-return-type c++17 c++20 decltype-auto
已经有很多,很多,很多关于这些问题和答案尾随返回类型,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(); }
Run Code Online (Sandbox Code Playgroud)
decltype(auto) (以及更一般的推论返回类型)和尾随返回类型是正交特征。
你可以有:
decltype(auto) f() {}auto f() -> decltype(auto) {}尾随的返回类型很好,尤其是要访问函数名称之前没有的上下文
至于模板:
template <typename T>
auto f(T x) -> decltype(bar(x));
Run Code Online (Sandbox Code Playgroud)
与
template <typename T>
decltype(bar(std::declval<T&>())) f(T x);
Run Code Online (Sandbox Code Playgroud)或针对班级中的从属名称:
auto C::begin() -> iterator;
Run Code Online (Sandbox Code Playgroud)
与
C::iterator C::begin();
Run Code Online (Sandbox Code Playgroud)唯一需要它的地方是lambda(如果您有/想要明确指定返回类型):
[]() -> some_type {/*...*/}[]() -> auto {/*...*/}(相当于[]() {/*...*/})[]() -> decltype(auto) {/*...*/}当我们必须定义lambda的返回类型时,就是应该返回引用类型的情况。
与decltype(auto)和完成auto。
decltype(auto)和auto演绎类型不同,主要是T&&和T。
推导的返回类型需要定义主体。
他们也不允许SFINAE,因为没有替代。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |