std
名前空間に型を追加することは許容されますか? たとえば、TCHAR に適した文字列が必要な場合は、次のように指定できますか?
#include <string>
namespace std
{
typedef basic_string<TCHAR> tstring;
}
または、独自の名前空間を使用する必要がありますか?
std
名前空間に型を追加することは許容されますか? たとえば、TCHAR に適した文字列が必要な場合は、次のように指定できますか?
#include <string>
namespace std
{
typedef basic_string<TCHAR> tstring;
}
または、独自の名前空間を使用する必要がありますか?
専門分野のみが許可されます。したがって、たとえば、std::numeric_limits
タイプに特化することが許可されています。そしてもちろん、これは名前空間で発生する必要がありますstd::
。ただし、typedefは特殊化されていないため、未定義の動作が発生します。
[C++11: 17.6.4.2.1/1]:
特に指定がない限り、名前空間std
または名前空間内の名前空間に宣言または定義を追加する場合、C++プログラムの動作は未定義です。std
プログラムは、宣言がユーザー定義型に依存し、特殊化が元のテンプレートの標準ライブラリ要件を満たし、明示的に禁止されていない場合にのみ、任意の標準ライブラリテンプレートのテンプレート特殊化を名前空間stdに追加できます。
いいえ...名前空間の要点の一部は、アップグレード時の名前の衝突を防ぐことです。
std 名前空間に何かを追加すると、ライブラリの次のリリースで同じ名前のものを追加すると、コードが壊れる可能性があります。
標準ライブラリにコードを追加しても、その追加に関する情報をオンラインで検索するユーザーを混乱させるだけなので、独自の名前空間を使用する必要があります。
std にあるのは標準ライブラリだけで、他には何もありません。
公式には、標準ではそれは「未定義の動作」であり、あらゆる種類の厄介なことが起こる可能性があると言われています。
実際には問題なく動作しますが、それでも行うべきではありません。何かがコンパイラによって提供されていると人々を混乱させる以外に、それはあなたに何をもたらしますか?
これは興味深い質問です。なぜなら、これはプロジェクトとエンジニアが受け入れたコーディング基準に対して完全に主観的なものだからです。
プログラマーが 1 人しかいない場合は、注意してください。
チームのために、標準を作る...
クロスプラットフォーム プロジェクトの場合、ええ。
それ以外の場合は、nawdawg.
不幸な名前の衝突を避けるために、タイプを自分の名前空間に配置する必要があるという他の回答に完全に同意します。
しかし、私は時々、std名前空間に何かを追加できる(そしてそうすべきです!)ことを正確にしたかったのです。これは、たとえばstd :: swapメソッドのテンプレート特殊化の場合であり、オブジェクトをスワップするための統一された方法を提供するために使用されます。この問題の詳細については、非スロースワップイディオムについて読むことができます。