メモ:このような使い方をしても大丈夫である理由(出典:
N4296)
23.3.6.1 Class template vector overviewの2 さんが書きました:A vector satisfies all of the requirements of
(中略)
and, for an element type other than bool, of a contiguous container (23.2.1).
std::vector<bool>以外のstd::vectorは"contiguous container"です。
23.2.1 General container requirementsの13 さんが書きました:A contiguous container is a container that supports random access iterators (24.2.7) and whose member
types iterator and const_iterator are contiguous iterators (24.2.1).
"contiguous container"とは、("random access iterators"が使えて)iteratorとconst_iteratorが"contiguous iterators"であるコンテナです。
24.2.1 In generalの5 さんが書きました:Iterators that further satisfy the requirement that, for integral values n and dereferenceable iterator values
a and (a + n), *(a + n) is equivalent to *(addressof(*a) + n), are called contiguous iterators.
"contiguous iterators"は、イテレータaと整数nについて(aと(a + n)がdereferenceableなとき)
*(a + n)が*(addressof(*a) + n)と等価になるイテレータの呼び名です。
20.7.12.1 addressof さんが書きました:template <class T> T* addressof(T& r) noexcept;
Returns: The actual address of the object or function referenced by r, even in the presence of an
overloaded operator&.
addressof(r)は(&演算子がオーバーロードされていても)rが示すオブジェクトまたは関数のアドレスを返します。
よって、std::vector (std::vector<bool>を除く)はイテレータによる要素の参照とアドレスによる要素の参照で同じデータが得られるので、
std::vector (std::vector<bool>を除く)の先頭要素へのポインタを配列の先頭要素へのポインタとして渡してもいい、ということになるはずです。
ということは、
コード:
vector <int> array;
array.resize(2); // AllNum
LoadDivGraph("./test.png", 2, 2, 1, 32, 32, &*array.begin());
と書いたほうが安全(安心)かもしれないと思いました。