[Development] Fornux C++ Superset
Phil Bouchard
philippeb8 at gmail.com
Thu Apr 26 05:35:46 CEST 2018
On 04/25/2018 09:45 AM, Eric Lemanisser wrote:
> What about
> void foo(int (&array)[3])
This one works fine:
void foo(int (&array)[10])
{
cout << __PRETTY_FUNCTION__ << endl;
}
int main()
{
int array[10];
foo(array);
return 0;
}
Correctly outputs:
void foo(const boost::node_proxy &, boost::root_array<std::vector<int>,
10> (&))
> and
> template<int N>
> void foo(int (&array)[N]) ?
Since I just started testing C++98 as of last week, I haven't yet had a
chance to test templates thoroughly. So this one is buggy and I'll have
to fix it.
> Both of these functions make sure the caller and the callee use the same
> array size at compile time. I don't see anybody giving away this kind of
> security, especially fro functions called across translation units. Does
> your system store the length of the array next to the pointer at runtime
> ? What is the cost of this ?
root_array<> looks like this:
template <typename T, size_t S>
class root_array : public boost::root_ptr<T>
{
typedef boost::root_ptr<T> base;
public:
root_array(base const & p) : base(p)
{
}
root_array(boost::node_proxy const & __y) : base(__y, "",
boost::create<typename T::value_type>()(__y, S))
{
}
[...]
};
So it knows the length of the array at compile-time but it really
creates a root_ptr pointing to a std::vector of size S allocated at
runtime. This is the lowest common factor necessary to make a smooth
conversion to a root_ptr.
Regards,
-Phil
More information about the Development
mailing list