17に割り当てられます。 §23.1¶3では、あなたが言ったように、コンテナに格納されたオブジェクトはCopyConstructible
(§20.1.3で指定)とAssignable
である必要があります。タイプT
ため
Assignable
要件はt
とタイプT
のu
され、あなたがすることができる、ということです。
t = u
持つ戻り値としてT&
と事後条件としてu
に相当t
。 t = u
を行うことは、コンパイル・エラー(§7.1.5.1¶5)を引き上げるため、(§23.1¶4)
はこのように、const
タイプは、はっきりAssignable
ではありません。
これはMicrosoft実装のバグだと思います。 Linuxのg ++は、vector<const int>
(-std=c++0x
フラグの有無にかかわらずテスト済み)をインスタンス化しようとしても、典型的な25kajillion行のテンプレートエラーを出力します。なお、これについては、IBM FAQでも詳細に説明する。別ウィンドウ(タブ)の大きな表示で見る理論的には
、@James McNellisは(それは未定義の動作だ場合何が起こることができます - すべての作業罰金を含む)コンパイラがベクトルのインスタンス化に爆破するために必要とされていない、言ったように。ただし、割り当てステートメントには、コンパイルエラーを生成する標準違反があります。
実際、operator[]
メンバーはvector<const int>::reference
を返します。それはT
(§23.1¶5表66)の左辺値であることが必要です。 T
はconst
タイプであるため、const
値です。そのため、const
要素への代入を「不正な形式」として実行しようとするコードを定義するコードを定義する(§7.1.5.1¶5)に落ちます。これは、コンパイルエラーまたは少なくとも警告を必要とします。 - const
は診断可能なルールです(§1.4¶1-2)(「診断は必要ありません」ステートメントは指定されていません)。
実際に最終的な編集は、@James McNellisは正しいです。 vector<const int>
をインスタンス化して未定義のビヘイビアを呼び出すと、通常のルールは値を持たなくなるため、要素タイプからconst
を削除するか、通常の鼻悪魔を生成するなど、実装はまだ標準に準拠します。
VS - 2010では、v [0] 'に新しい値*を割り当てることができます。それを試してみてください! –
私はVCがtypeid(ベクトル :: value_type).name()について何を提供しているのか不思議です(そしてtypeid(ベクトル :: value_type).name()またはdemangleと比較してください)。 –
一つと同じ: 'int'。 –