Почему
Хедер <map> содержит функцию std::data(). Однако следующий код не компилируется:
#include <map>
int main() {
std::data(std::map<int,int>{});
}
error: no matching function for call to 'data(std::map<int, int>)'
Зачем тогда она в нём, если для этого класса неприменима?
Ответы (1 шт):
Корректный, но бесполезный ответ: потому что так в стандарте сказано.
Конкретно, iterator.range#1 говорит что std::data (и другие схожие шаблоны) должно быть видно в <map> (и других хедерах):
In addition to being available via inclusion of the
<iterator>header, the function templates in[iterator.range]are available when any of the following headers are included:<array>,<deque>,<forward_list>,<list>,<map>,<regex>,<set>,<span>,<string>,<string_view>,<unordered_map>,<unordered_set>, and<vector>
где "in [iterator.range]" мы находим begin, end, cbegin, cend, rbegin, rend, crbegin, crend, size, ssize, empty, и data
Добавил std::data в стандарт документ n4280 (первая версия - n4017) - похоже автор решил не затруднять всем жизнь и добавил новые близкородственные шаблоны одной пачкой. Несмотря на то, что std::data действительно не работает с std::map.