Home > OS >  Is this a correct implementation of ConvertsWithoutNarrowing
Is this a correct implementation of ConvertsWithoutNarrowing

Time:05-22

I am currently learning about concepts in C 20, and came across this example:

template <typename From, typename To>
concept is_convertible_without_narrowing = requires (From&& from) {
  { std::type_identity_t<To[]>{std::forward<From>(from)}} -> std::same_as<To[1]>;
};

I am curious if the following can be considered a correct alternative implementation of the above:

template <typename From, typename To>
concept is_convertible_without_narrowing = requires (From&& from) {
  { To{std::forward<From>(from)} } -> std::same_as<To>;
}

or, even simpler:

template <typename From, typename To>
concept is_convertible_without_narrowing = requires (From&& from, To&& to) {
  to = {from};
}

CodePudding user response:

I am curious if the following can be considered a correct alternative implementation of the above:

The simple answer is no.

In the second version, To{std::forward<From>(from)} can be regarded as constructing To through initializer_list, so is_convertible_without_narrowing<int, std::vector<int>> will be true.

Similarly, the third version can be regarded as assigning To with initializer_list, so is_convertible_without_narrowing<int, std::vector<int>&> will also be true.

  • Related