我目前正在学习C++20中的概念,并遇到了以下示例:
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]>;
};我感到好奇的是,以下几点是否可以被认为是实现上述目标的正确选择:
template <typename From, typename To>
concept is_convertible_without_narrowing = requires (From&& from) {
{ To{std::forward<From>(from)} } -> std::same_as<To>;
}或者,甚至更简单:
template <typename From, typename To>
concept is_convertible_without_narrowing = requires (From&& from, To&& to) {
to = {from};
}发布于 2022-05-21 19:13:25
我很好奇,是否可以认为以下是上述实现的一个正确的替代实现:
答案很简单:不。
在第二个版本中,To{std::forward<From>(from)}可以看作是通过initializer_list构建To,因此is_convertible_without_narrowing<int, std::vector<int>>就是true。
同样,第三个版本可以被认为是用initializer_list分配initializer_list,因此is_convertible_without_narrowing<int, std::vector<int>&>也将是true。
https://stackoverflow.com/questions/72332387
复制相似问题