Re: why does this work with Visual C++ 2005?
On Tuesday, 1 October 2013 07:03:22 UTC+1, gwowen wrote:
"K. Frank" <kfrank29.c@gmail.com> writes:
Is this purely a wart on c++ due to backward compatibility and the
long history of c/c++? Or does it actually make sense (at least in
part) when viewed through modern eyes?
I think its a wart. I totally understand the decisions that were made,
but it'd be nice to see the deprecated in favour of std::array.
Except that std::array doesn't replace it in its main uses. You
can't pass an `std::array` to a C interface (you need to take
the address of it's first element explicitly), and you can't get
the compiler to calculate its dimensions from the number of
initializers.
I think the C++ committees lack of interest in C99 VLAs
suggest they're not keen on them anyway (VLAs are worse,
having no way to recover from OOM).
I hate almost all of C's array handling, especially the way the
typedef char typedefed_array_type[10];
breaks the type system in subtle ways.
Array types are broken in C. That's well known. But for
historical reasons, it's something we have to live with.
For example:
void fun(typedefed_array_type x)
{
typedefed_array_type y;
assert(sizeof(x) == sizeof(y));
}
Any type that triggers that assert is wartier than a warthog with HPV.
But you probably wouldn't want to pass an array by value anyway.
And if you use pass by reference:
void
fun( typedefed_array_type const& x )
{
typedefed_array_type y;
assert( sizeof(x) == sizeof(y) );
}
the assert doesn't trigger. (But of course, in most cases,
typedef std::vector<char> typedefed_array_type;
would be far more appropriate. I'm not arguing that C style
arrays are a good thing. Just that we cannot deprecate them
because there is nothing else which does what they do.)
--
James