函数头中的条件运算符“?:”和 LPCTSTR

Condition operator "?:" and LPCTSTR in function header

也许谁能给我解释一下:

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));

在这种情况下它工作正常。

乍一看,我想

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

也可以,如果可以,您可能遇到了类型转换问题,该问题已由

LPCTSTR strNull = NULL;

赋值,因为它会在稍后调用strNull时将类型LPCTSTR与null的值相关联。

条件运算符将其第二个和第三个参数转换为它们两个共有的类型。我不知道 CString 的细节,所以这只是一个猜测,但看起来条件运算符将 NULL 转换为 CString 以匹配第三个参数的类型,并通过对 LPCTSTR 的隐式转换将其传递给函数。

这是因为需要将第二个和第三个操作数转换为通用类型。
(根据条件是否为真,结果不能有不同的类型。)

第一个参数相当于

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

因为 NULL 没有可以将 CString 转换为的类型。
CString(NULL)构造了一个空的CString

第二个相当于

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

因为 CString 可以转换为 LPCTSTR 但不能反过来。

内联演员,

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

应该和第二个效果一样。