开发者

Is default destructor of POD static?

I'm compiling with /Wall, and getting the warning C4100: 'ptr' : unreferenced formal parameter warning. The warning seems to be caused by calling the destructor on MSVC's std::_Container_proxy, which has a default destructor.

My Code:

template<class T>
class linear_allocator {
    //...other declarations...
    static void destroy(pointer ptr);
};
//...other definitions...
template<class T>
inline void linear_allocator<T>::destroy(typename linear_allocator<T>::pointer ptr)
{
    ptr->~T(); //line 262.  warning C4100: 'ptr' : unreferenced formal parameter
}
//ironically, this isn't a test case, this is my actual thingy class.  Go figure.
struct thingy { 
    unsigned int DATA;
    thingy() : DATA(0xABCDEF) {}
    ~thingy() {assert(DATA == 0xABCDEF);}
};
int main() {
    typedef std::vector<thingy, linear_allocator<thingy>> thingyholder;
    std::vector<thingyholder> holder;
}

The full text of the warning is:

      f:\code\utilities\linear_allocator\linear_allocator.h(261): warning C4100: 'ptr' : unreferenced formal parameter
      f:\code\utilities\linear_allocator\linear_allocator.h(262) : while compiling class template member function 'void linear_allocator<T>::destroy(std::_Container_proxy *)'
      with
      [
          T=std::_Container_proxy
      ]
      f:\code\utilities\linear_allocator\linear_allocator.h(178) : while compiling class template member function 'linear_allocator<T>::~linear_allocator(void) throw()'
      with
      [
          T=std::_Container_proxy
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\vector(454) : 开发者_如何学运维see reference to class template instantiation 'linear_allocator<T>' being compiled
      with
      [
          T=std::_Container_proxy
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\vector(452) : while compiling class template member function 'std::_Vector_val<_Ty,_Alloc>::~_Vector_val(void)'
      with
      [
          _Ty=thingy,
          _Alloc=linear_allocator<thingy>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\vector(481) : see reference to class template instantiation 'std::_Vector_val<_Ty,_Alloc>' being compiled
      with
      [
          _Ty=thingy,
          _Alloc=linear_allocator<thingy>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\vector(1307) : see reference to class template instantiation 'std::vector<_Ty,_Ax>' being compiled
      with
      [
          _Ty=thingy,
          _Ax=linear_allocator<thingy>
      ]
      c:\program files\microsoft visual studio 10.0\vc\include\vector(1301) : while compiling class template member function 'void std::vector<_Ty>::_Tidy(void)'
      with
      [
          _Ty=thingyholder
      ]
      f:\code\utilities\linear_allocator\main.cpp(71) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
      with
      [
          _Ty=thingyholder
      ]

I see that it's using the destructor of std::_Container_proxy, which is simply:

struct _Container_proxy
{   // store head of iterator chain and back pointer
_Container_proxy()
    : _Mycont(0), _Myfirstiter(0)
    {   // construct from pointers
    }

const _Container_base12 *_Mycont;
_Iterator_base12 *_Myfirstiter;
};

According to MSVC C4100: 'application' : unreferenced formal parameter warning, this can happen if The functions you are calling using the application object are static functions, so they aren't really referencing the application object.. std::_Container_proxy appears to be a POD, does that mean the default destructor is static as an optimization?

(Yes, I know various workarounds to make the warning go away. I want to be sure WHY I'm getting the warning before I put in ptr=ptr; //warning workaround.)


This is a known bug in Visual C++: "Visual C++ gives unexpected warning C4100 on explicit call to object destructor".

The warning can be safely ignored (or suppressed via #pragma warning or /Wd4100).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜