0

私はこのようなコードを書きました:

#include<string>  
using namespace std;  
int main() {  
    string str;
    ...
    if(str=="test")    //valid????
        //do something
    ...
    return 0;
}

後でコードを読み直した後、コンパイラがどのようにエラーを出さなかったのか興味がありました。
注:参照をすでに確認しましたが、何らかのタイプの不一致エラーがあるはずです(文字列オブジェクトとcharの配列を比較)

編集:=to==タイプミスでごめんなさい。すでに修正されています

編集2:問題:

  • reference(cppreference.com)で定義されているoperator ==(string、char *)またはoperator ==(string、char [])または同様の演算子はありません。
  • char*またはchar[]から文字列への変換演算子はありません
4

4 に答える 4

3

他の人が述べているように、シングル=サインは比較ではなく割り当てを実行します。

ただし、比較演算子は、割り当てのように、C++の最も重要な機能の1つである演算子のオーバーロードによって定義されます。

str = "test"は関数呼び出しstr.operator= ("test")に変換され、式は、、またはのstr == "test"いずれかが機能する方に変換されます。str.operator== ("test")operator==(str,"test")

std::stringとのオペランドに対してオーバーロード関数が定義されていない場合でもchar *、コンパイラは、引数をそのような関数に一致する型に変換する関数を見つけようとします。

編集:ハァッ、std::stringに変換できないboolので、if条件はまだエラーになります。これは、質問のスニペットを作成した結果だと思います。

于 2013-02-25T09:40:42.180 に答える
2
if(str="test")  //it's an assignment not a comparison.

に変更しますif(str=="test")

 why no compile errors?

それはcではなくc++だからです。この演算子std::stringを定義しました。==

if(str="test")  //it's an error: because you can't convert string to boolean type. 
                  which is expected as condition.

error like :could not convert 's.std::basic_string<_CharT, _Traits, _Alloc>::operator=
<char, std::char_traits<char>, std::allocator<char> >(((const char*)"p"))' from 
'std::basic_string<char>' to 'bool' 
于 2013-02-25T09:39:33.647 に答える
0

これを行う場合

if(str="test"){}

に「テスト」を割り当てますstr。これは有効な操作であるため、割り当ては&strオブジェクトへの参照を返すため、if条件は常に満たされます。もちろん、その場合str == 0はエラーが発生します。だからより良いこと:

if(str == "test"){}

James Kanzeに感謝します!

于 2013-02-25T09:41:14.080 に答える
0

前述のように、演算子のオーバーロードによるコンパイルエラーではありません(比較ではなく割り当てているという事実を無視します)。この演算子なしでオブジェクトを使用すると、はい、コンパイルエラーになります。

// Foo does not have comparision operator
struct Foo {};

// Bar have comparision operator
struct Bar
{
    // Next line is the operator overload.
    bool operator ==(const char *pstr) const { return true; };
};

// string have comparision operator
std::string Test("test");

if (Foo == "test")  // compilation error
if (Bar == "test")  // uses the Bar::operator ==
if (Test == "test") // uses the basic_string<char>::operator ==
{ /* do something */ }
于 2013-02-25T09:52:01.677 に答える