<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/139143>139143</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] Check request: readability-use-element-projections
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
denzor200
</td>
</tr>
</table>
<pre>
Needs a check that suggests using views `std::views::keys`, `std::views::values` and `std::views::elements` in foreach loop.
Assume we have a map and vector of tuples:
```
std::map<std::string, double> sample_map;
std::vector<std::tuple<std::string, double, bool>> sample_tuples;
```
BEFORE:
```
for (const auto& [name,_] : sample_map)
std::cout << name << std::endl;
for (const auto& kv : sample_map) {
const double mass = kv.second;
std::cout << mass << std::endl;
}
for (const auto& elements : sample_tuples)
std::cout << std::get<2>(elements) << std::endl;
```
AFTER:
```
for (std::string const& name : std::views::keys(sample_map))
std::cout << name << std::endl;
for (const double mass : std::views::values(sample_map))
std::cout << mass << std::endl;
for (const bool element2 : std::views::elements<2>(sample_tuples))
std::cout << element2 << std::endl;
```
Keep in mind that we should avoid using `auto` for simple typenames like `std::string`, `double`, `bool`, etc.. (does everybody agree with that? any doubts - it should be as an option) due to readability reasons.
Also I don't see any reason to use as const reference any trivial types, like `double`, `bool`, etc.
Also it would be nice to have an option to enable pipe sintax:
```
for (std::string const& name : sample_map | std::views::keys)
std::cout << name << std::endl;
for (const double mass : sample_map | std::views::values)
std::cout << mass << std::endl;
for (const bool element2 : sample_tuples | std::views::elements<2>)
std::cout << element2 << std::endl;
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0ll1v6zYPxz-NckMkUOS8-cIXTtoADx5gAw52fyBbrK1VljxTdpd9-kF-W9oe5wA7Z0CB2gZF_sg_yUgS6cIiJmx_ZvunlWx96ZpEof3LNYLzVebULWE8_QVREUjIS8xfwZfSA7VFgeQJWtK2gE7jGwE7cPKKRSmL0v7L8PiKN2IHzsRlyaKTpsVgA9KqJSM0WKH1vZm28OIalHkJxrl6w3jKeJoStRXCG0IpOwQJlax7jx3m3jXgXsC3tcHeIU8D0_DH0zlgJWsWXeZX8o22RUBXrs0MsugZSFa1wa-95fn-7BDm_ngf7qE_cYHMOcOi5zvXE-X5AyXj6fn5-uuX588JvLgGmDjlzpIH2XrHxAHY_mxlFYJ8ZfsnYFF6Dy9ixlMAgJkud60HFl1YdIFwcHqeDdAqM2IthHztPocBdjyPoQbjIXeoJBGw6Aleuw1h7qwafC8yjQcWmY5PD8im_rnnGwv9uBLzxwI9iy4iaCVOczuG_B6V6YOA6fW35y-L-n1olKFegX6UI4XFCROn99r-VHnfK_ZtinGKv83xr_T8ABEGZZJRLGLMwsxSfRL7cWnuIiySvdf0_4h12EmVtmrYj28IVLrWKJCd02pck-zA-2488LC-gHTgAn-rMchBYPQrvlt_47qYl-e4NOb3fnUMb-jzzSbUSjkkwA6bW9jfIIsGEd60L3syFl1B2lsvqCdYg_YTaYYgCaQFV3vtbGhs1SJ4Bw1KJTNttL-FZ3KWwspNDTn4H6hge_RAiL3rwSKca6l3OajX4As2aPPByDe609L0yVPgn3L_TorjEIXI2sPbBG513pMOi39KIXxBK0Pn1rpGIG29_PNHhm_ubGDHy4NZ_E9n7_sQ0yg-xPjx6bufq0WWT_P4M4dvpZJIxVEsV5hsj7vDMdrFh9OqTKL4IFHIODpFsdhhdlTbA-Y7ecpeMIvzeKUTwcWe7_lJcB6L4-Z0OmY7vt_uxPHA1RbZjmMltdkY01Ub1xQrTdRiso3i7S5aGZmhoenu1CTBap21BbEdN5o8_XPOa2_6W1ZupC3WXqtb-Dm-9NepBv9okXyo592YrVvC9ViLdd243zEPDU2rtjFJ6X3dF1dcmbgW2pdttsldxcQ1xBz_TceYuPbgxMR1ZO8S8XcAAAD__zu-BEc">