2016-07-20 3 views

答えて

3

あなたの文字列リテラルwstringが、より簡単にwstringより(崩壊経由const wchar_t*に)boolに変換さconst wchar_t[]ではありません。ビジュアル・スタジオでコードを実行

は私に、このエラーが発生しました:ほとんど完璧な説明を与える
warning C4800: 'const wchar_t *' : forcing value to bool 'true' or 'false' (performance warning)

+1

文字列リテラルは 'const wchar_t *'ではありません - これはconstの配列 'wchar_t'です(まったく同じものではありません)。 –

+0

正しい。私はそれを修正します。 – DeathTails

1

あなたは暗黙の型変換のルールに噛まれています。問題はL"my string data for test"boolでもstd::wstringでもないことです。実際にはwchar_tというconst配列です。

boolに変換することができます。これは、配列の崩壊によってポインターに変換され、次にboolへのポインターが変換されます(ポインターがNULLの場合はテストします)。

適切なコンストラクタを呼び出すことによってstd::wstringに変換できます。

問題は、標準では、コンパイラーが「間違った」ものを選択するように求めていることです。

おそらく、適切な追加のオーバーロードを書くことをお勧めします。例えば:

void test(const wchar_t* p) 
{ 
    test(std::wstring(p)); 
} 
4

リテラルワイド文字列型const wchar_t [N+1]です。 >const wchar_t* - - >bool

  • const wchar_t[N+1] - >const wchar_t* - >std::wstring
  • 最初のバージョンは、オーバーロードの解決ために選択され

    1. const wchar_t[N+1]:あなたはtestにそれを渡すと、2つの可能性のある経路が存在します標準ブール変換をboolに、ユーザ定義の変換をstd::wstringにそれぞれ優先させることをお勧めします。

      可能な解決策の1つは、Martin suggestsというように、std::wstringを明示的に作成することですが、これは後で再度お考えになると思います。代わりに、別の名前の2つの関数を使用して問題を回避するか、const wchar_t*を受け取り、std::wstringバージョンに転送するオーバーロードを追加します。

      void test(const wchar_t* w) { 
          test(std::wstring{w}); 
      } 
      
    +0

    これは、私が何を言おうとしていたかをはっきりと説明しています。ワークアラウンドを追加することを提案できますか(別のオーバーロードを追加して「右」関数を呼び出す) –

    +3

    2番目の場合、シーケンスは 'const wchar [N + 1]' - > 'const wchar *' - > 'std :: wstring'です(実際には' wchar'は 'wchar_t'でなければなりません)。基本的にポインタを 'bool'に変換する方が、ユーザ定義の変換よりも優先されます(つまり、' std :: wstring'のコンストラクタを呼び出す)。 – Peter

    +0

    @Peter Fixed、ありがとうございます。 – TartanLlama

    3

    すべての答えは、C++ 14を使用している場合、最初のケースで渡すリテラルを微調整するだけです。

    #include <iostream> 
    #include <string> 
    using namespace std; 
    
    //Function for bool data 
    
    void test(const bool b) { 
        wcout << L"bool data is : " << b << endl; 
    }; 
    
    //Function for wstring data 
    
    void test(const wstring &w) { 
        wcout << L"wstring data is : " << w.c_str() << endl; 
    }; 
    
    int main() { 
        test(L"my string data for test"s); 
        test(true); 
        return 0; 
    } 
    

    output

    wstring data is : my string data for test
    bool data is : 1

    関連する問題