三值运算符将类扩展宏应用于两个操作数 < >我使用微软Visual C++ 2010和Windows 7。

三值运算符将类扩展宏应用于两个操作数 < >我使用微软Visual C++ 2010和Windows 7。,c++,class,visual-c++,macros,ternary-operator,C++,Class,Visual C++,Macros,Ternary Operator,我有DataDecoder类来解码一些数据。这是: template< typename T > class DataDecoder { private: T lpData; public: DataDecoder() { lpData = NULL; } DataDecoder( T lpSource ) { lpData = (T)DecodeStaticData(lpSource); } ~DataDecoder() { if(lpDat

我有
DataDecoder
类来解码一些数据。这是:

template< typename T >
class DataDecoder
{

private:

    T lpData;

public:

    DataDecoder() { lpData = NULL; }
    DataDecoder( T lpSource ) { lpData = (T)DecodeStaticData(lpSource); }
    ~DataDecoder() { if(lpData) free(lpData); }
    operator T() { return lpData; }
};
在这一点上,奇怪的事情开始发生。首先,我在我的
DecodeStaticData()
中得到NULL参数。但这不可能是真的:
\u STR\u A()
仅适用于有效参数。然后我决定看看拆解:

0011843A  cmp         dword ptr [lpAdditionalData],0  
00118441  je          WinMain+172h (118462h)  
00118443  push        offset string "SOMEDATA" (124068h)  
00118448  lea         ecx,[ebp-0C2Ch]  
0011844E  call        DataDecoder<char *>::DataDecoder<char *> (117770h)  
00118453  or          dword ptr [ebp-0C14h],1  
0011845A  mov         dword ptr [ebp-0C34h],eax  
00118460  jmp         WinMain+18Ch (11847Ch)  
00118462  push        0  
00118464  lea         ecx,[ebp-0C28h]  
0011846A  call        DataDecoder<char *>::DataDecoder<char *> (117770h)
0011843A cmp dword ptr[lpAdditionalData],0
00118441 je WinMain+172h(118462h)
00118443推送偏移字符串“SOMEDATA”(124068h)
00118448 lea ecx,[ebp-0C2Ch]
0011844E呼叫数据解码器::数据解码器(11770H)
00118453或dword ptr[ebp-0C14h],1
0011845A mov dword ptr[ebp-0C34h],eax
00118460 jmp WinMain+18Ch(11847Ch)
00118462推送0
00118464 lea ecx,[ebp-0C28h]
0011846A呼叫数据解码器::数据解码器(11770H)
正如您所看到的,类构造函数在两种情况下都被调用,对于“SOMEDATA”和NULL也是如此

这是正确的行为吗?我该怎么处理

更新:我打开了对文件的预处理,这就是我看到的:

LPSTR lpTemp = lpAdditionalData ? DataDecoder<char*>("SOMEDATA") : 0;
LPSTR lpTemp=lpAdditionalData?数据解码器(“SOMEDATA”):0;

因此,这不是预处理器的问题。

与任何表达式一样,涉及条件运算符的表达式必须具有类型。一个表达式
c?a:b
不能神奇地拥有一个在运行时根据
c
的值而变化的类型—有时是
a
的类型,有时是
b
的类型。相反,如果
a
b
属于不同的类型,则存在复杂的规则,通过尝试将其中一个强制为另一个的类型来确定整个表达式的最终类型


在您的情况下,
DataDecoder(x)
不能强制为
NULL
类型,但是
NULL
可以通过用户定义的转换
DataDecoder(NULL)
强制为
DataDecoder
。这就是您观察到的。

与任何表达式一样,涉及条件运算符的表达式必须具有类型。一个表达式
c?a:b
不能神奇地拥有一个在运行时根据
c
的值而变化的类型—有时是
a
的类型,有时是
b
的类型。相反,如果
a
b
属于不同的类型,则存在复杂的规则,通过尝试将其中一个强制为另一个的类型来确定整个表达式的最终类型


在您的情况下,
DataDecoder(x)
不能强制为
NULL
类型,但是
NULL
可以通过用户定义的转换
DataDecoder(NULL)
强制为
DataDecoder
。这就是你观察到的。

谢谢,你说得对。我将
DataDecoder
转换为
(char*)
,问题现在解决了。谢谢,你说得对。我将
数据解码器
转换为
(char*)
,现在问题解决了。
0011843A  cmp         dword ptr [lpAdditionalData],0  
00118441  je          WinMain+172h (118462h)  
00118443  push        offset string "SOMEDATA" (124068h)  
00118448  lea         ecx,[ebp-0C2Ch]  
0011844E  call        DataDecoder<char *>::DataDecoder<char *> (117770h)  
00118453  or          dword ptr [ebp-0C14h],1  
0011845A  mov         dword ptr [ebp-0C34h],eax  
00118460  jmp         WinMain+18Ch (11847Ch)  
00118462  push        0  
00118464  lea         ecx,[ebp-0C28h]  
0011846A  call        DataDecoder<char *>::DataDecoder<char *> (117770h)
LPSTR lpTemp = lpAdditionalData ? DataDecoder<char*>("SOMEDATA") : 0;