Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取C+中变量地址的最方便、最可靠的方法+;_C++_Visual C++_Casting - Fatal编程技术网

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 ) )
}