Car*_*ten 7 c++ visual-c++ std-ranges c++23
目前只有 MSVC 支持 nifty helper ranges::to,所以我无法在另一个编译器中验证这一点。基本上,我有一个 STL 容器的类型别名,一旦我尝试将其传递给ranges::to,编译就会失败。那么这是有效的用法吗?为什么下面的第二个(注释掉的)示例无法编译?
#include <ranges>
#include <vector>
#include <iostream>
template <typename T>
using Vec = std::vector<T>;
int main(int argc, char* argv[]) {
    auto vec = std::views::iota(1, 10) | std::ranges::to<std::vector>();
    //auto vec = std::views::iota(1, 10) | std::ranges::to<Vec>(); // C2440: cannot convert from 'void' to 'std::vector'.
    for (auto& v : vec)
        std::cout << v << ", ";
    std::cout << std::endl;
}
这是一个简化的示例,删除了范围内容
#include <type_traits>
template <typename T, typename Alloc=T>
struct A {
    template <typename R>
    A(R&&, Alloc={});
};
template <typename R, typename Alloc=std::type_identity_t<R>>
A(R&&, Alloc={}) -> A<std::type_identity_t<R>, Alloc>;
#if 0
    template <typename T> using B = A<T>;
#elif 0
    template <typename T, typename U=T> using B = A<T, U>;
#elif 0
    template <typename... Ts> using B = A<Ts...>;
#endif
int main(int argc, char* argv[]) {
    auto a = A(1);
    auto b = B(1);
}
可以使用三种不同的方法来实现B,对于本示例来说,它们的行为可能应该相同,但事实并非如此:
U默认我真的不知道谁是对的,别名的类模板参数推导规则([over.match.class.deduct],从 /3 开始)非常复杂。看起来这三个定义确实应该给你相同的结果,但是......
无论哪种方式,将别名模板与ranges::to. 这只是别名模板的实际推导规则是什么以及它们实际起作用的程度的问题。