Long time ago, I reported bug to Visual C++ 9.0 (Visual Studio 2008 SP1) complaining that has_trivial_destructor applied to void returns true (ID:458570). I also discussed it with folks on comp.std.c++ where, among quite different voices, Pete Becker writes:
[tr.meta.req]/8 in TR1 requires is_pod
::value to be 1. n2857 is not a standard, and implementations of previous standards are not wrong for not doing what isn’t yet required of them.
and later concludes:
Under the current standard, using the name std::is_pod requires a diagnostic. So if you want to be literal, both compilers are “wrong”. Nevertheless, neither is really “wrong”, they just implement different non-standard versions of is_pod.
So, Visual C++ might actually not be wrong. Fair enough.
Today, I got back to this issue for a while a little extending my test program to use the type traits from both, TR1 and C++0x:
#include <iostream>
#include <tr1/type_traits>
int main()
{
using std::cout; using std::endl;
cout << std::tr1::is_pod<void>::value << endl;
cout << std::tr1::has_trivial_destructor<void>::value << endl;
cout << std::is_pod<void>::value << endl;
cout << std::has_trivial_destructor<void>::value << endl;
}
and compiled it with GCC 4.4.1:
$ g++ -Wall -pedantic -std=c++0x void.cpp $ ./a.out 1 1 0 0
Now, my confusion has been raised to the power of 2. This is clearly a Polnische Wirtschaft or Czech movie or Turkish sermon…
…let’s try to ask libstdc++ folks.