Boost logo

Boost Users :

Subject: Re: [Boost-users] [MPL][MP11] Return value of at_c for out of range index
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2019-03-04 21:53:26


On 3/4/19 2:41 PM, Mateusz Loskot via Boost-users wrote:
> Hi,
> While porting some code from MPL to MP11, the latter helped to find some
> bugs in the ported code [1]
> I looked closer at those and found 'behavioural' differences between
> MPL and MP11
> when accessing sequences with index value that is out of range.
> Could anyone help me to understand the following?
> 1. Why this compiles?
> using R = at_c<range_c<int, 0, 1>, 100>::type;
> Tested in C++11 using GCC, clang, MSVC from VS2017/2019

It compiles because there's no range check.
It isn't something that you're supposed to do,

> 2. Why this compiles in GCC and clang, but fails with MSVC?
> using V = at_c<vector3_c<unsigned, 1, 2, 3>, 100>::type::type;

It's essentially equivalent to:
auto V = std::vector<int>{1, 2, 3}[100];
which has undefined behavior.

It would be better if it consistently produced
an error, of course, but the short answer is
don't do that.

> 3. For GCC and clang, why this compiles
> static_assert(std::is_same<R, integral_c<int, 100>>::value, "");
> but this fails?
> static_assert(std::is_same<V, integral_c<unsigned int, 100>>::value, "");
> Don't vector_c and range_c yield equivalent sequences?

They're only equivalent if you say within bounds.

> By the way, MP11's mp_at_c yield void, as expected, there also
> no ::type or ::value member, so diagnostics is clearer.


In Christ,
Steven Watanabe

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at