C++ 获取C+中变量地址的最方便、最可靠的方法+;
如果变量类型重载了C++ 获取C+中变量地址的最方便、最可靠的方法+;,c++,visual-c++,casting,C++,Visual C++,Casting,如果变量类型重载了运算符&(),则使用&获取变量地址可能会有问题。例如,has操作符(&()重载,其副作用是修改对象 现在我有一组复杂的模板,其功能如下: template<class T> void process( const T* object ) { //whatever } template<class T> void tryProcess( T& object ) { process( &object ) } 使用此
运算符&()
,则使用&
获取变量地址可能会有问题。例如,has操作符(&()
重载,其副作用是修改对象
现在我有一组复杂的模板,其功能如下:
template<class T>
void process( const T* object )
{
//whatever
}
template<class T>
void tryProcess( T& object )
{
process( &object )
}
使用此函数,我可以实现tryProcess()
,如下所示:
template<class T>
void tryProcess( T& object )
{
process( getAddress( object ) )
}
模板
void tryProcess(T&object)
{
进程(getAddress(对象))
}
无论类T
是否有操作符(&()
重载,都会得到相同的行为。这就在Visual C++ 7上引入了优化的零开销——编译器得到了什么,得到了目标地址。
这个问题的解决方案具有多大的可移植性和标准编译器?如何改进呢?是通过重新解释cast
技巧实现的,所以我认为它可能是可移植的,符合标准的
您可以看到有问题的代码。这是标准投诉。这个问题引起了ISO C++委员会关于< <代码> >的问题的关注。考虑的解决方案包括收紧POD定义,或对与
offsetof
一起使用的类型增加额外限制。当提出重新解释
解决方案时,这些解决方案被拒绝。由于这提供了一种解决问题的符合标准的方法,委员会认为没有必要对的偏移量增加额外的要求,并对实现进行了修复。谢天谢地,人们不再需要增强,现在是std::addressof
:供以后的读者参考:C++11标准化了这个习惯用法的一个包装整齐的(以前是boost
)版本,如std::addressof
:`
template<class T>
void tryProcess( T& object )
{
process( getAddress( object ) )
}