三元运算符将类扩展宏应用于这两个操作数
Ternary operator applies class-expanding macro to the both of operands
我使用Visual C++ 2010和Windows 7 Microsoft。
我有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; }
};
这个类工作得很好。我也有这个宏:
#define _STR_A(x) DataDecoder<char*>(x)
它也很完美。但是我的代码中还有另一种结构:
LPVOID lpAdditionalData = NULL;
LPSTR lpTemp = lpAdditionalData ? _STR_A("SOMEDATA") : NULL;
在这一点上,奇怪的事情开始发生。首先,我在DecodeStaticData()
中得到 NULL 参数。但这不可能是真的:_STR_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)
如您所见,在这两种情况下都调用了类构造函数,用于"SOMEDATA"和NULL!
这是正确的行为吗?我该如何处理?
更新:我打开了对文件的预处理,这就是我看到的:
LPSTR lpTemp = lpAdditionalData ? DataDecoder<char*>("SOMEDATA") : 0;
因此,这不是预处理器问题。
与任何表达式一样,涉及条件运算符的表达式必须具有类型。表达式c ? a : b
不能神奇地具有在运行时根据c
的值而更改的类型 - 有时是a
的类型,有时是b
的类型。相反,如果a
和b
属于不同的类型,则存在复杂的规则来确定整体表达式的最终类型,方法是尝试将一个类型强制为另一个类型。
在您的情况下,DataDecoder<char*>(x)
不能强制到NULL
的类型,但NULL
可以通过用户定义的转换DataDecoder<char*>(NULL)
强制DataDecoder<char*>
。这就是你观察到的。
相关文章:
- c++r值引用应用于函数指针
- 如何将记忆应用于此递归函数?
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 应用于运算符而不是构造函数的显式关键字
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 应用于无符号类型的一元减号运算符
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 我可以将c ++清理器仅应用于程序的一部分而不是第三方库吗?
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 如何在OpenGL中将纹理应用于子网格
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 将平移应用于特征顶点
- 模板包扩展以将函数应用于连续的参数对
- c ++如何将模板应用于模板类的孩子/朋友?
- 将函数应用于特征矩阵中的所有元素,而无需循环
- 这些重载运算符如何应用于表达式 d***b?
- 将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 时出错?
- 应用于整型类型的编译时优化 'std::isfinite()'
- 三元运算符将类扩展宏应用于这两个操作数