私はこのようなクラスを持っています:
class Test{
public:
Test(string value);
Test(bool value);
};
次のようなオブジェクトを作成すると:
Test test("Just a test...");
bool コンストラクターが呼び出されます。
誰でも理由を知っていますか?
ありがとう
私はこのようなクラスを持っています:
class Test{
public:
Test(string value);
Test(bool value);
};
次のようなオブジェクトを作成すると:
Test test("Just a test...");
bool コンストラクターが呼び出されます。
誰でも理由を知っていますか?
ありがとう
の型は"Just a test..."
isconst char *
であり、暗黙的に または のいずれbool
かに変換できますstd::string
。std::string
は組み込み型ではないため、 const char *
s は に変換されbool
ます。を明示的に に変換することで、これを防ぐことができconst char *
ますstd::string
。
Test test(std::string("Just a test..."));
これはよく知られている C++ の問題です。
文字列リテラルには、chat const[] のタイプがあります。2 つのコンストラクターがあり、char const[] から Test への変換シーケンスは次のようになります。
1) char const[] -> char const* -> bool
2) char const[] -> char const* -> std::string
1) は組み込みの標準変換ですが、2) はユーザー定義の変換です。組み込みの変換はユーザー定義の変換よりも優先されるため、文字列リテラルは std::string よりも bool に簡単に変換されます。
の型は"Just a test..."
ですconst char*
。bool
からへの非組み込み変換よりも優先される組み込みのポインターからへの変換がありconst char*
ますstd::string
。
ブール変換が推奨される理由std::string
は、標準ライブラリの一部であるが、整数、ポインター、およびブール値のような組み込み型ではないためです。他のクラスと同様に動作するため、その変換コンストラクターは、組み込み型への変換後にのみ考慮されます。
この問題を回避する 1 つの方法は、const char* を受け取り、明示的に std::string に変換する別のコンストラクターを提供することです。
1 つの引数しかとらないコンストラクター (特に複数のコンストラクター) がある場合は、この種の驚きを避けるために、それらを "明示的" に宣言するのが適切な場合があります。これにより、クラスのユーザーは、使用したいコンストラクターに正しい型を与えることを確認し、これらの暗黙的な型変換がユーザーの背後で行われ、見つけにくいバグが隠されるのを防ぐことができます。
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15&rll=1
C++0x では、同じ問題を防ぐために、これが変換演算子に拡張されました。
http://www2.research.att.com/~bs/C++0xFAQ.html#explicit-conversion
1 つの方法は、std::string 型の変数を作成し、その変数を次のように渡すことです。
std::string test = "TEST";
A a(test);
このようにしstd::string
て、受け入れるコンストラクターにデフォルト設定されないため、型が明示的に定義されますbool