1. ホーム
  2. c++

[解決済み] C++11ではvector<const T>が使えるようになりましたか?

2023-04-09 19:38:35

質問

C++03 と C++11 ではコンテナの要件が変わりました。 C++03 では包括的な要件(ベクターのコピー構成可能性や割り当て可能性など)がありましたが、C++11 ではコンテナ操作ごとに細かな要件が定義されています(第 23.2 項)。

その結果、割り当てを必要としない特定の操作のみを実行する限り、たとえば const メンバを持つ構造体など、コピー構築可能だが割り当て不可能な型をベクトルに格納できます(構築および push_back はそのような操作です。 insert は違う)。

私が疑問に思っているのは、この規格では現在 vector<const T> ? 私は、それが許されない理由は何もないと思います。 const T は、const メンバを持つ構造体と同じように、コピー構築は可能ですが代入はできない型です - しかし、私は何かを見逃しているかもしれません。

(私が何かを見落としたかもしれないと思う理由のひとつは、gcc trunk で vector<const T> をインスタンス化しようとすると、gcc trunkはクラッシュして燃えるのですが vector<T> では問題ありません。)

どのように解決するのですか?

いいえ、アロケータの要件では、T は "非構成、非参照オブジェクト型" にすることができるとされていると思います。

定数オブジェクトのベクトルでは、あまり多くのことはできないでしょう。また const vector<T> はどうせほとんど同じだろう。


何年も経った今でも、この即答はコメントと票を集めているようです。常に上昇するわけではありません :-)

そこで、いくつかの適切なリファレンスを追加するために

私が紙で持っているC++03標準の場合、[lib.allocator.requirements]セクションの表31にはこう書かれています。

T, U any type

ではない どんな のタイプは実際に機能しました。

そこで、次の規格である C++11 では を近いドラフトで を[allocator.requirements]に、そして現在は表27に記載しています。

T, U, C any non-const, non-reference object type

というのは、もともと私が記憶で上に書いたものに極めて近いです。質問の内容もこれです。

しかし、C++14では( 草案 N4296 ) 表 27 にはこう書かれています。

T, U, C any non-const object type

おそらく、参照は結局のところオブジェクト型ではないからでしょうか?

そして今、C++17では( 草案 N4659 ) では、表 30 に書かれています。

T, U, C any cv-unqualified object type (6.9)

ということは、それだけでなく const が除外されただけでなく volatile . おそらく、いずれにせよ古いニュースであり、単なる明確化である。


以下もご参照ください。 ハワード・ヒナント氏による直接の情報 をご覧ください。