Date: Sat, 17 Feb 2024 12:59:00 +0100

sob., 17 lut 2024 o 12:49 Tiago Freire via Std-Proposals

<std-proposals_at_[hidden]> napisaĆ(a):

>

>

> >I don't really get the following case in your code:

> > if constexpr (sizeof(T) >= sizeof(U)) return false;

>

> Ok, the statement is phrased in the negative, i.e. If I can represent a value in its destination type then the result is false, meaning that casting this type doesn't change the meaning of the value.

> In this branch std::is_signed_v<T> == std::is_signed_v<U> is true, i.e. that they are both signed or both unsigned

> Then this compares the storage size, and T is the type we are converting too, if the type we are converting too has a greater or equal storage size and it has the same "signed'ness" , then I can always convert it without affecting the representation.

>

> Thus explaining

> > Why would T not be able to represent x in the event that T is larger.

> > Doesn't this imply that "would_cast_modify<long long>(0)" is false?

>

> false means you can represent.

>

>

> > In the case where the signedness is left unchanged by the cast, you can probably do:

> > static_cast<From>(static_cast<To>(x)) == x

> > This simply checks whether the roundtrip conversion preserves the value.

>

> Note we are not checking for round-trip convertible. Take the following example:

>

> constexpr int8_t test_case = -1;

> constexpr uint32_t converted_case = static_cast<uint32_t>(test_case);

> constexpr int8_t round_trip_case = static_cast<int8_t>(converted_case);

> static_assert(test_case == round_trip_case);

>

> This is round-trip convertible but it is not one-way convertible as converted_case cannot represent -1.

Maybe we need two conversions like:

```

static_cast<uint32_t>(static_cast<std::make_unsigned_t<decltype(test_case)>>(test_case))

== test_case

```

This will skip the sign extension on one side. And this will break

this equation if one side was negative.

> --

> Std-Proposals mailing list

> Std-Proposals_at_[hidden]

> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals

<std-proposals_at_[hidden]> napisaĆ(a):

>

>

> >I don't really get the following case in your code:

> > if constexpr (sizeof(T) >= sizeof(U)) return false;

>

> Ok, the statement is phrased in the negative, i.e. If I can represent a value in its destination type then the result is false, meaning that casting this type doesn't change the meaning of the value.

> In this branch std::is_signed_v<T> == std::is_signed_v<U> is true, i.e. that they are both signed or both unsigned

> Then this compares the storage size, and T is the type we are converting too, if the type we are converting too has a greater or equal storage size and it has the same "signed'ness" , then I can always convert it without affecting the representation.

>

> Thus explaining

> > Why would T not be able to represent x in the event that T is larger.

> > Doesn't this imply that "would_cast_modify<long long>(0)" is false?

>

> false means you can represent.

>

>

> > In the case where the signedness is left unchanged by the cast, you can probably do:

> > static_cast<From>(static_cast<To>(x)) == x

> > This simply checks whether the roundtrip conversion preserves the value.

>

> Note we are not checking for round-trip convertible. Take the following example:

>

> constexpr int8_t test_case = -1;

> constexpr uint32_t converted_case = static_cast<uint32_t>(test_case);

> constexpr int8_t round_trip_case = static_cast<int8_t>(converted_case);

> static_assert(test_case == round_trip_case);

>

> This is round-trip convertible but it is not one-way convertible as converted_case cannot represent -1.

Maybe we need two conversions like:

```

static_cast<uint32_t>(static_cast<std::make_unsigned_t<decltype(test_case)>>(test_case))

== test_case

```

This will skip the sign extension on one side. And this will break

this equation if one side was negative.

> --

> Std-Proposals mailing list

> Std-Proposals_at_[hidden]

> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals

Received on 2024-02-17 11:59:12