- iterator[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp17[meta cpp]
namespace std {
template <class C>
constexpr auto data(C& c) -> decltype(c.data()); // (1) C++17
template <class C>
constexpr auto data(const C& c) -> decltype(c.data()); // (2) C++17
template <class T, std::size_t N>
constexpr T* data(T (&array)[N]) noexcept; // (3) C++17
template <class E>
constexpr const E* data(initializer_list<E> il) noexcept; // (4) C++17
}
- initializer_list[link /reference/initializer_list/initializer_list.md]
コンテナの要素が格納されたメモリ領域へのポインタを取得する。
- (1), (2) :
return c.data();
- (3) :
return array;
- (4) :
return il.begin();
- 機能テストマクロは
__cpp_lib_nonmember_container_access
で値は201411
<iterator>
ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
#include <vector>
#include <iostream>
void some_c_like_api_function(const int* arr, std::size_t arr_size)
{
std::cout << "array size:" << arr_size << " at " << static_cast<const void*>(arr) << std::endl;
}
int main()
{
int arr[4] = {};
some_c_like_api_function(std::data(arr), std::size(arr));
std::vector<int> v { 12 };
some_c_like_api_function(std::data(v), std::size(v));
}
- std::data[color ff0000]
- std::size[link size.md]
false
false
true
false
false
- C++17
- Clang: 3.6
- GCC: 6.1
- ICC: ??
- Visual C++: 2015