次のようなコードを見てきました。
std::string str = "wHatEver";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
::
そして質問があります: tolower の前にとはどういう意味ですか?
動作しstd::tolower
ませんが、正常に::tolower
動作します
次のようなコードを見てきました。
std::string str = "wHatEver";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
::
そして質問があります: tolower の前にとはどういう意味ですか?
動作しstd::tolower
ませんが、正常に::tolower
動作します
が必要な理由については::
、標準では の 2 つtolower
の 、 の関数テンプレート、および
std::
と の両方の単純な関数が定義されています。インクルードされたヘッダー (および、他のヘッダーから間接的にインクルードされたヘッダーを含みますが、これについては知らない可能性があります) に応じて、一方、他方、または両方が表示される場合があります。Usingは、C 標準からの古いものが使用されることを保証します。(
変換がテンプレート自体であり、コンパイラがテンプレート引数を推測できないため、 の 1 つが考慮される場合、呼び出しはあいまいになります。)::
std::
::
std::
私がそうしている間::tolower
、少なくともプレーンな char が署名されている場合、このように使用することは未定義の動作であることに言及するかもしれません。への入力
::tolower
は int で、0
... UCHAR_MAX
、またはの範囲内でなければなりませんEOF
。プレーン char が署名されている場合、一部の文字が負のエンコーディングを持つ可能性があり、未定義の動作が発生します。実際には、ほとんどの実装でこれが機能します。0xFF
(Latin 1 の ÿ)を除くすべての文字。移植性に関心がない場合は、一部のコンパイラには、char を unsigned にするスイッチがあります---それを使用してください。それ以外の場合は、それを正しく処理するための小さな機能オブジェクトを作成します。次のいずれかを行います。
struct ToLower
{
char operator()( char ch ) const
{
return ::tolower( static_cast<unsigned char>(ch) );
}
};
または(より良いですが、かなり多くの作業---頻繁に使用する場合にのみ価値があります)、コンストラクターがロケール(デフォルトでグローバルロケール)を取り、関数に使用する への参照を含む機能std::ctype
オブジェクトtolower
. (もちろん、本当に国際化されているのであれば、tolower
おそらく何の意味もありません。また、マルチバイト エンコーディングである UTF-8 を使用することになり、利用可能などの方法でも機能しません。)
tolower
グローバル名前空間(おそらくstdc libのもの)で明示的に使用していることを意味します。
例:
void foo() {
// This is your global foo
}
namespace bar {
void foo() {
// This is bar's foo
}
}
using namespace bar;
void test() {
foo(); // Ambiguous - which one is it?
::foo(); // This is the global foo()
}
グローバル名前空間のバージョンを使用してください。(おそらく含まれており、機能し<ctypes.h>
ない<cctypes>
場合は含まれてstd::
いません)
:: はグローバル名前空間です。
#include <iostream>
void bar()
{
std::cout << "::bar" << std::endl;
}
namespace foo
{
void bar()
{
std::cout << "foo::bar" << std::endl;
}
}
int main()
{
bar();
foo::bar();
::bar();
using namespace foo;
foo::bar();
::bar(); // bar() would be ambiguous now without ::
}