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

Ram*_*nas 8 c++ mfc atl

也许任何人都可以向我解释一下:

bool Func1(LPCTSTR sData)
{
    if (sData) { ... }
}
Run Code Online (Sandbox Code Playgroud)

我把这个函数称为:

CString str = _T("");
Func1((str.IsEmpty() ? NULL : str));
Run Code Online (Sandbox Code Playgroud)

并且函数内部的'sData'永远不会为NULL,它总是空字符串而不是NULL,为什么?Eddited代码是这样的:

LPCTSTR strNull = NULL;
Func1((str.IsEmpty() ? strNull : str));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它的工作正确.

Pet*_*ker 5

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


mol*_*ilo 5

这是由于需要将第二个和第三个操作数转换为通用类型.
(结果不能有不同的类型,具体取决于条件是否为真.)

第一个参数相当于

str.IsEmpty() ? CString(NULL) : str
Run Code Online (Sandbox Code Playgroud)

因为NULL没有您转换为的类型CString.
CString(NULL)构造一个空的CString.

第二个相当于

str.IsEmpty() ? strNull : (LPCTSTR) str
Run Code Online (Sandbox Code Playgroud)

因为CString可以转换,LPCTSTR但不是相反.

内联演员,

    str.IsEmpty() ? (LPCTSTR) NULL : str
Run Code Online (Sandbox Code Playgroud)

应该给出与第二个相同的效果.