2016-05-09 9 views
17

我々はすぐにVS2015にアップグレードされ、私は破壊の変更リストでこれを見つけた:Visual Studio 2015:constポインタのセットは許可されていますか?

constの要素

C++のconst要素 の標準常に禁じられたコンテナ(このようなベクターとして、あるいは設定) 。 Visual C++ 2013およびそれ以前のバージョン がこのようなコンテナを受け入れました。現在のバージョンでは、そのようなコンテナはコンパイルするには に失敗します。

source

これもセットに適用された場合、誰もが知っている場合、私は思っていました。 私は地図にconstポインタがキーとして含まれている可能性があることを知っています。

例:

std::set<const QObject*> 

が、私はまだこれを行うことができますか?私はマイクロソフトのサイトのポストによると、そうは思わないだろう。

+16

'のconst Tの*'と 'Tの*のconst'ません同じこと:あなたが失敗するmapコードをしたい場合は、このようなカスタムアロケータを指定する必要があります。 –

+2

引用には、文字通りセットに適用されることが記載されています。しかし、あなたのコードは見積もりとはあまり関係がありませんので、あなたは安全です:) –

+1

アスタリスク(または参照のアンパサンド)の前のスペースを省略して、誤解を招くような、 。 'const QObject *'を書くと、 '*'は 'const'よりもQObjectに厳密に束縛されていることが視覚的に示唆されます。 'const'を動かすことは役に立ちません:' QObject const * '。それは 'return a * x + b * y;'のようなものです。 –

答えて

26

const QObject*は、ポインタからconst QObjectまでです。ポインタ自体は依然として変更可能です。 const QObject* constは、ポインタ自体をconstにします。

constオブジェクトについては、const QObject*ではありません。であるため、この例は問題ありません。

4

私は地図にconstポインタがキーとして含まれている可能性があることを知っています。

std::set<T* const>は常に無効であり、std::map<int* const, int* const> s;は常に有効です。なぜなら、std::setのアロケータはstd::allocator<Key>であり、std::mapのアロケータはstd::allocator<std::pair<const Key, T>>であるからです。定義上、std::allocator<const T>は不正な形式です。

int i = 42; 
int* const j = &i; 
std::map<int* const, int* const, 
    std::allocator<const std::pair<int* const, int* const>>> s{{j, j}}; 
関連する問題