$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Daniel Frey (d.frey_at_[hidden])
Date: 2003-12-09 14:33:04
On Tue, 09 Dec 2003 19:41:13 +0100, Rani Sharoni wrote:
> Daniel Frey wrote:
>> Rani Sharoni wrote:
>>> I accidentally encounter some bug in EDG (latest) that is exploitable
>>> for implementing is_incomplete. I personally despise this ODR rebel
>>> but I suspect that some really like it.
>>
>> I was thinking about something similar while fixing checked_delete, but
>> refrained from it as violating the ODR seemed to dangerous to me. Check
>> the "feature" of some compilers to set the sizeof(T) to 0 for
>> incomplete types T. Maybe it works on more compilers than the bug you
>> found currently, since some vendors think it's a feature :o)
>
> I suspect that except for EDG no compiler is compliant enough to allow
> such abuse :)
Hm, either I midread what you wrote above or you misread what I wrote
above :) Let's clarify my point with some code:
--- File t.h ---
template< typename T > struct is_complete
{
enum { value = sizeof(T) > 0 };
};
--- File t.cc ---
#include <iostream>
using namespace std;
#include <t.h> // Important: don't use "t.h"!
class X;
class Y {};
int main()
{
cout << is_complete< void >::value << endl;
cout << is_complete< void const >::value << endl;
cout << is_complete< int >::value << endl;
cout << is_complete< int const >::value << endl;
cout << is_complete< int volatile >::value << endl;
cout << is_complete< int const volatile >::value << endl;
cout << is_complete< X >::value << endl;
cout << is_complete< X const >::value << endl;
cout << is_complete< X volatile >::value << endl;
cout << is_complete< X const volatile >::value << endl;
cout << is_complete< X[] >::value << endl;
cout << is_complete< X[ 2 ] >::value << endl;
cout << is_complete< Y >::value << endl;
cout << is_complete< Y const >::value << endl;
cout << is_complete< Y volatile >::value << endl;
cout << is_complete< Y const volatile >::value << endl;
cout << is_complete< Y[] >::value << endl;
cout << is_complete< Y[ 2 ] >::value << endl;
}
--- Compiled with the Intel 7.1 ---
icc -ansi -O2 -I. t.cc
This does what you expect but with a much easier implementation and you
might want to check what other compilers say about it, e.g. CW
Regards, Daniel