Почему содержит std::data()?

Хедер <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 шт):

Автор решения: Cubbi

Корректный, но бесполезный ответ: потому что так в стандарте сказано.

Конкретно, 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.

→ Ссылка