Re: Type completeness as library requirement
On 08.11.2010 08:08, Nikolay Ivchenkov wrote:
According to N3126 - 3.9/9,
"Scalar types, trivial class types (Clause 9), arrays of such types
and cv-qualified versions of these types (3.9.3) are collectively
called trivial types."
Thus, an array (possibly of unknown bound) can be trivial type, non-
trivial type, or an array type whose triviality cannot be determined
because its element type is incomplete.
According to N3126 - Table 45, preconditions for std::is_trivial are
defined as follows:
"T shall be a complete type, (possibly cv-qualified) void, or an
array of unknown bound"
It seems that "an array of unknown bound" should be changed to "an
array of unknown bound of a complete element type". Preconditions for
some other templates (e.g., std::is_trivially_copyable,
std::is_standard_layout, std::is_pod, and std::is_literal_type) should
be changed similarly.
I agree and forwarded to LWG.
On the other hand, some preconditions look too restrictive. For
example, std::is_empty and std::is_polymorphic might accept any
incomplete non-class type.
This sounds reasonable as well.
Default allocator and containers like
std::vector might also be instantiated with incomplete element type:
#include<vector>
struct A;
struct X
{
// what is the point to require
// completely defined type A here?
std::vector<A> v;
};
struct A
{
int i;
};
int main()
{
X x;
x.v.push_back(A());
}
I would consider these as separate issues, that would break at least some
existing implementations, AKFAIK. I forgot which library implementation it was,
but the program became ill-formed, when std::vector<A> was instantiated with
incomplete A, because some
static assertions assumed the completeness of the value type, which is ok as of
the current specification.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]