2016-09-07 5 views
8

たぶん誰も私にこれを説明することができます条件演算子「:?」とLPCTSTR機能ヘッダー内の

bool Func1(LPCTSTR sData) 
{ 
    if (sData) { ... } 
} 

そして、私はこのような関数を呼び出し:

CString str = _T(""); 
Func1((str.IsEmpty() ? NULL : str)); 

そして「SDATA」内部の機能NULLは決してありません、それは常に空文字列ですがNULLではないのです、なぜですか? 編集されたコードは次のとおりです。

LPCTSTR strNull = NULL; 
Func1((str.IsEmpty() ? strNull : str)); 

この場合は正しく動作します。

+0

'Func1((str.IsEmpty()?NULL:str));' VS2015でコンパイルされず、 'エラーC2446 'を取得します:': 'CString'から 'int'への変換なし\t ... ' –

答えて

5

これは、第2オペランドと第3オペランドの両方を共通タイプに変換する必要があるために発生します。
(結果は条件が真であるかどうかに応じて、異なるタイプを持つことができません。)

NULLあなたは変換タイプを持っていないので、最初のパラメータは

str.IsEmpty() ? CString(NULL) : str 

に相当しますa CString to。
CString(NULL)は、空のCStringを構成します。

第二は、CStringため

str.IsEmpty() ? strNull : (LPCTSTR) str 

と等価である他の方法で回避LPCTSTRに変換可能ではありません。キャストをインライン化

str.IsEmpty() ? (LPCTSTR) NULL : str 

が第二と同じ効果を与える必要があります。

+0

そして、私はまだ[CString](https://msdn.microsoft.com/en-us/library/cws1zdt8。aspx)c'torは 'CString(NULL) 'という式で解決されます。ポインタ引数を取るいくつかの要素があります。コンパイラはどのようにして(そしてどちらが)選択されますか? – IInspectable

+0

私は今すぐ入手します:単一のポインタ引数を取っているすべてのc'torsは、 'const XCHAR *'を取るものを除いて、 '明示的'です。 – IInspectable

1

は、一見すると、私は

Func1((str.IsEmpty() ? (LPCTSTR)NULL : str)); 

もうまくいくことを想像し、それがない場合、あなたはおそらく

LPCTSTR strNull = NULL; 

割り当てによって固定し、型キャストの問題を抱えている、それはなるので、 strNullが後で呼び出された場合は、タイプLPCTSTRをヌルの値に関連付けます。

5

条件演算子は、2番目と3番目の引数を2つの引数に共通の型に変換します。私はCStringの詳細を知らないので、これは単なる推測ですが、条件演算子がNULLCStringに変換して3番目の引数の型と一致するように見え、暗黙の変換によってLPCTSTRに渡します関数。

+1

' CString'に暗黙の変換演算子([CSimpleStringT :: operator PCXSTR](https://msdn.microsoft.com/en-us/library/tk1z2hd9.aspx))があります。私はまだ、[CStringT :: CStringT](https://msdn.microsoft.com/en-us/library/cws1zdt8.aspx)コンストラクタがどのように解決されたか、それほどフォローしていません。 'NULL'ポインタと一致するものが複数あります。 – IInspectable