来自VS 2008中的C++/MFC编译器的奇怪结果

c00*_*0fd 3 c++ mfc visual-studio-2008

我以为我非常了解VS 2008 C++编译器:

CString str;
str.Empty();
LPCTSTR pStr = str.IsEmpty() ? NULL : str;
::MessageBox(NULL, pStr ? L"pStr is NOT null" : L"pStr is null", L"Result", MB_OK);
Run Code Online (Sandbox Code Playgroud)

有人可以解释我为什么得到这个?

在此输入图像描述

Edw*_*nts 6

LPCTSTR pStr = str.IsEmpty() ? (LPCTSTR)NULL : str;确实会回来NULL.

看起来这是因为两个表达式的类型不同; MSDN Docs

如果两个表达式都是指针类型或者如果一个是指针类型而另一个是一个计算结果为0的常量表达式,则执行指针转换以将它们转换为通用类型

来自MSDN论坛帖子的引用:

标准中的5.16-3-描述了此处发生的类型强制; 表达式(B?E1:E2)只能有一种类型,所以如果表达式E1和E2的类型不同,在评估任何一个表达式之前,它们必须被强制转换为一个通用的安全类型......所以,此示例中的E1类型为CString,E2的类型为int.5.16-3中描述的过程最终得出结论,转换为这两者的唯一安全类型是CString.