尾随返回类型中的占位符类型的用途是什么
What is the purpose of a placeholder type in a trailing-return-type?
根据[dcl.fct]/2,下面的代码片段是合法的。GCC 和 clang 编译并执行代码,
#include <iostream>
int i = -1;
auto f()->auto&& { return i; }
int main(){
f() = 2;
std::cout << i << 'n';
}
印刷
2
但是,在C++允许这样做的目的是什么?
在上面的例子中,只需将尾随返回类型替换为 int&
即可获得相同的结果。换句话说,我正在寻找一个包含占位符类型的尾随返回类型有意义的示例。
你可以对一致性提出一个论点:你可以将其他类型作为尾随返回类型,为什么不能使用占位符呢?
auto f() -> int& { return i; }
auto f() -> auto& { return i; }
你可以对效用进行论证:lambda 的返回类型看起来像尾随返回类型,没有其他地方可以放置占位符类型,所以无论如何你都必须允许它用于 lambda,所以不妨允许它用于函数?
auto f = []() -> int& { return i; };
auto f = []() -> auto& { return i; };
您可以对代码格式进行论证。尾随返回类型允许以一致的方式声明始终适用于所有情况的函数,因此只需将其排列:
auto g(auto x) -> decltype(f(x)) { ... } // using trailing for parameter
auto Cls::member() -> type { ... } // using trailing for scope (to find Cls::type)
auto h(auto x) -> auto& { ... } // using trailing for formatting
可能还有其他论点。但简而言之,它很容易被允许,而且显然有优点。
您可以在修订版 N3582 (2013-03-15)1 中找到auto
原始提案的答案:
尾随返回型
auto
该提案最初不允许尾随返回类型中的 auto,但从那时起,有人指出,将其放在那里是指定 lambda 通过推导的引用类型返回的唯一方法:
[]()->auto& { return f(); }
(请记住,不仅函数,而且 lambda 也可以具有尾随返回类型)
因此 [dcl.spec.auto]/2:
auto
类型说明符可能与具有尾随返回类型 ([dcl.fct]) 的函数声明符一起出现在此类声明符有效的任何上下文中。
1 注意:N3582 在实际采用之前已被 N3638 取代。
相关文章:
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 这在C++是什么类型的错误?
- int(int)& 或 int(int) const &是什么类型?
- 我如何找出3D容器的元素是什么类型
- 在 c 和 c++ 中,二维数组的元素是什么类型?
- 这个 lambda 的参数是什么类型?
- 转换逻辑目标是什么类型
- 如果我创建一个修改值的迭代器,静态成员"reference"应该是什么类型?
- 这是什么类型的行为
- 给定以下内容,"function"是什么类型?
- C++:文本文件中的数据是什么类型的
- C++11 中的"auto var = {condition} ? 1 : 1.0"是什么类型?是双精度还是整数?
- C++中的 decltype(this) 是什么类型
- 如何知道模板<类型名称类型>是什么类型?
- 内置数组的大小是什么类型?
- c++ 11中的std::chrono::high_resolution_clock::now()是什么类型?
- 在Microsoft Visual C++中,光线跟踪器应该是什么类型的项目
- 如何为delete编写一个C包装器,既快速又释放给定的任何类型,而不告诉它是什么类型
- 如何编写一个函数,无论数组是什么类型都输出它