C++標準ライブラリ提供のシーケンスコンテナ/文字列クラスdata
メンバ関数 についてメモ。
まとめ:
std::basic_string<E>::data
メンバ関数は、常に文字列先頭を指すconst E *
を返す。この仕様はC++98/03からC++11まで不変。*1- 2016-03-27追記:C++17(C++1z)から非const版
data
メンバ関数が追加された(→id:yohhoy:20160327)下表最右列に追記済み。
- 2016-03-27追記:C++17(C++1z)から非const版
- C++11で追加された
std::vector<T>::data
,std::array<T>::data
メンバ関数は、対象オブジェクトのconst性に応じて先頭要素を指すT *
もしくはconst T *
を返す。同メンバ関数はC++03以前では提供されない。
対象オブジェクトの型 | C++03以前 | C++11 | C++17 |
---|---|---|---|
basic_string<E> |
const E * |
const E * |
E * |
const basic_string<E> |
const E * |
const E * |
const E * |
vector<T> |
(N/A) | T * |
T * |
const vector<T> |
(N/A) | const T * |
const T * |
array<T> |
(N/A) | T * |
T * |
const array<T> |
(N/A) | const T * |
const T * |
C++03
ISO C++03 21.3よりbasic_stringクラステンプレートおよび関連するメンバ関数の宣言を引用(一部は簡略化)。vector
クラステンプレートにはdata
メンバ関数は存在せず、またarray
クラステンプレートは提供されない。
namespace std { template<class E> class basic_string { public: //... // 21.3.6 string operations: const E * c_str() const; const E * data() const; //... }; }
C++11
C++11(N3337) 21.4, 23.3.2.1, 23.3.6.1よりクラステンプレートおよび関連するメンバ関数の宣言を引用(一部は簡略化)。
namespace std { template<class E> class basic_string { public: //... // 21.4.7, string operations: const E * c_str() const noexcept; const E * data() const noexcept; //... }; }namespace std { template <class T, size_t N> struct array { //... T * data() noexcept; const T * data() const noexcept; }; }namespace std { template <class T> class vector { public: //... // 23.3.6.4, data access T * data() noexcept; const T * data() const noexcept; //... }; }
関連URL
- cppreference - vector::data, array::data, basic_string::data
- cpprefjp - vector::data, array::data, basic_string::data
- C++標準文字列:c_str, data, operator[] - yohhoyの日記
- c++ - Legal to overwrite std::string's null terminator? - Stack Overflow
- c++ - Why is modifying a string through a retrieved pointer to its data not allowed? - Stack Overflow