は私が持っているメソッド:std :: stringを期待する関数に "C string"を渡すことができますが、それは機能しますか?
void Foo::Bar(const std::string &str)
{
printf("%d", str.length());
}
をし、私は"hello"
がconst char *
、ないstd::string
思った
foo.Bar("hello");
を行うときには、シームレスに動作しますか?
は私が持っているメソッド:std :: stringを期待する関数に "C string"を渡すことができますが、それは機能しますか?
void Foo::Bar(const std::string &str)
{
printf("%d", str.length());
}
をし、私は"hello"
がconst char *
、ないstd::string
思った
foo.Bar("hello");
を行うときには、シームレスに動作しますか?
は、ユーザー定義型が暗黙的に変換することができ、2つの方法があります変換コンストラクタで
単一のパラメータを使用し、キーワード「明示的」を使用しないコンストラクタは、暗黙的な変換(パラメータの型から構築されるオブジェクトの型への変換)を定義します。標準の文字列クラスは、この変換の利便性を提供するために意図的に "明示的"を使用しません。
std :: stringにはconst char *
というコンストラクタがあるため、C++は自動的に一時的な文字列オブジェクトを作成します。
技術的にはchar const[6]
ですが、暗黙の変換とstd::string
のコンストラクタのいずれかのおかげでこれを行うことができます。
?暗黙的な? std::string(char *)
コンストラクタを使用してchar *
からstd::string
への変換。
あなたの質問に多少関連しています:もしあなたが* 明示的な * lyでコンパイラにこのようなタイプを変更させたくない場合は、互換性のあるコンストラクタが存在するとき、キーワード "明示的に "コンストラクタの前に。その後、コンパイラエラーが発生します。ただし、作成するタイプでのみこれを行うことができます。文字列のようなSTL型ではありません。
文字列リテラルはchar const[6]
です。
機能に渡すためにその名前はconst char*
に減衰します。
そして暗黙の変換が行われ、ため:
rvalue
を意味し、REF対CONSTを受け入れるconst char*
は暗黙std::string
rvalue
に変換することができます。 。
重要な点として、_non-explicit_コンストラクタです。 – ildjarn