【问题标题】:Condition operator "?:" and LPCTSTR in function header函数头中的条件运算符“?:”和 LPCTSTR
【发布时间】:2017-01-15 06:30:32
【问题描述】:

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

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() ? NULL : str)); 在 VS2015 上无法编译,我得到 Error C2446 ':': no conversion from 'CString' to 'int' ...

标签: c++ mfc atl


【解决方案1】:

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

第一个参数等价于

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

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

第二个等价于

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

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

内联演员表,

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

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

【讨论】:

  • 我仍然很困惑CString c'tor 在表达式CString(NULL) 中是如何被解析的。有几个 c'tors 接受指针参数。编译器如何选择一个(以及它是哪一个)?
  • 我现在明白了:所有采用单个指针参数的 c'tors 都是 explicit,除了采用 const XCHAR* 的那个。
【解决方案2】:

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

【讨论】:

【解决方案3】:

乍一看,我猜是

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

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

LPCTSTR strNull = NULL;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 2014-04-26
    • 2013-03-23
    • 2017-12-01
    • 2020-10-15
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多