5

使用されているいくつかのテンプレート コードのいくつかのエラーに頭を悩まstd::vector::value_typeせた後、次のように追跡しました。これは標準による正しい動作ですか、それとも MSVC 2012 CTP の問題ですか?

typedef std::vector<int>::value_type       t1;
typedef std::vector<int const>::value_type t2;

static_assert(!std::is_same<t1, t2>::value, "hmmm");

上記のアサーションは失敗します。

4

3 に答える 3

9

value_typeastd::vector<T>T(§23.3.6.1) です。

の値は、is_samecv 修飾子を考慮に入れます (§20.9.6)。

あなたの場合、それは をチェックすることを意味しますstd::is_same<int, int const>が、これは失敗するはずです。

これは、観察した動作が標準に従って間違っていることを意味します。MSVC は value_type の cv 修飾子を削除しているようです:

std::vector<const int>::value_type val = 5;
val = 10;

これは MSVC2008 でコンパイルされますが、gcc 4.4 では失敗します。

おそらく、Microsoft にバグ レポートを提出する必要があります。

編集:上記のNawazのコメントは私に考えさせました. この質問 によると、const int実際には C++03 では value_type として許可されて いません! それはC ++ 11にあるようですが。. C++11 ではベクトルに対して明示的に禁止されていませんが、アロケータ (§17.6.3.5) では禁止されているため、ベクトルに対しても違法になります。

いずれにせよ、サイレントにドロップする MSVC の動作は、constここでは間違っているようです。

于 2013-05-02T08:08:33.687 に答える
1

std::vector<const int>には許可されていないようです:標準によれば、TはあるべきでCopyInsertableあり、そうでconst intはありません。

ドラフトN3485の 23.2.3 シーケンス コンテナー [sequence.reqmts] のシーケンスコンテナー要件を参照してください。

OP コードは、行で gcc 4.7 と icc 13.0 の両方でコンパイルに失敗します。

typedef std::vector<int const>::value_type t2;

どうやら、MSVC は const 修飾子を破棄します。

于 2013-05-02T08:24:24.570 に答える