也许任何人都可以向我解释一下:
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)
在这种情况下,它的工作正确.
条件运算符将其第二个和第三个参数转换为两个参数共有的类型.我不知道细节CString,所以这只是一个猜测,但看起来条件运算符转换NULL为a CString匹配第三个参数的类型,并通过隐式转换传递LPCTSTR给函数.
这是由于需要将第二个和第三个操作数转换为通用类型.
(结果不能有不同的类型,具体取决于条件是否为真.)
第一个参数相当于
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)
应该给出与第二个相同的效果.
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |