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

时间:2016-09-07 14:02:56

标签: c++ mfc atl

也许有人可以向我解释一下:

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

第一个参数相当于

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

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

第二个相当于

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

因为CString可以转换为LPCTSTR而不是相反。

内联演员,

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

应该与第二种产生相同的效果。

答案 2 :(得分:1)

乍一看,我想象

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

也会起作用,如果确实如此,你可能会遇到由

修复的类型转换问题
LPCTSTR strNull = NULL;

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