14

私は次のようなC++03コードを持っています:

#include <boost/tr1/unordered_map.hpp>
...
std::tr1::unordered_map<std::string, int> mystuff;
...

コードをC++11に変換すると、後で苦しむのではないかと思い始めました。C++ 11には(おそらく)ありませんがstd::tr1::unordered_mapstd::unordered_map代わりにあります。だから私は次のハックを思いついた:

namespace std
{
    using namespace ::std::tr1;
}
...
std::unordered_map<std::string, int> mystuff; // no tr1 now!
...

それは合法ですか(多分にものをインポートすることstdは禁止されています)?C ++ 11コードとの移植/相互運用が容易になりますか?

4

4 に答える 4

16

名前空間には触れないでくださいstd。現在は機能していても、後で深刻な頭痛の種になる可能性があります(新しいバージョンのコンパイラ、別のコンパイラなど)。

更新:標準からの引用(C ++ 2003、セクション17.4.3.1「予約名」)(ここにあります):

特に指定がない限り、C++プログラムが名前空間stdまたは名前空間std内の名前空間に宣言または定義を追加することは定義されていません。プログラムは、任意の標準ライブラリテンプレートのテンプレート特殊化を名前空間stdに追加できます。標準ライブラリテンプレートのこのような特殊化(完全または部分的)は、宣言がユーザー定義の外部リンケージのタイプに依存しない限り、また特殊化が元のテンプレートの標準ライブラリ要件を満たさない限り、未定義の動作になります。[強調鉱山]

于 2012-05-24T10:55:53.020 に答える
7

::stdC ++ 11 17.6.4.2.1では、もののインポートは禁止されています。

特に指定がない限り、名前空間stdまたは名前空間内の名前空間に宣言または定義を追加する場合、C++プログラムの動作は未定義です。std

于 2012-05-24T11:13:51.943 に答える
3

この質問はあなたが尋ねているものと非常に似ていると思います。

特に、「autoconfを使用してシンボルの可用性を検出し、条件付き定義を使用して、指定された名前で適切な名前空間をエイリアスする」という答えが好きです。

于 2012-05-24T11:15:27.880 に答える
1

この種の移植性は、特定のライブラリをより明確にサポートできないという証拠がある場合にのみ試行する必要があります。理想的には#ifdef、特定の環境に固有のライブラリで囲む必要があります。

のポイントは、の内容からtr1あなたを隔離することでした。stdtr1

于 2012-05-24T11:35:59.837 に答える