我可以为数组写一个用户定义的推导规则向量吗?

Kla*_*ens 4 c++ arrays vector

是否有可能在std中扩展扣除规则?

#include <vector>
#include <array>

namespace std {
template< class T, size_t N >
vector(array<T, N>&) -> vector<T>;
}

int main() {

    std::array a = {2,3,5,7}; // array<int, 4> !

    std::vector w(a); 
}
Run Code Online (Sandbox Code Playgroud)

g ++ 10.0(wandbox)似乎忽略了我的版本。

根据clang9.0(也是Wandbox)在隐藏空间中的预定义规则liv:错误:推导指南必须在与模板'std :: __ 1 :: vector'相同的范围内声明

lub*_*bgr 7

不可以,您不能这样做。std仅在极少数情况下才允许将内容放入名称空间,例如,模板专门化std::hash。在您的情况下,可以使用类模板参数推导,而键入要比期望的多一点:

std::array a = {2,3,5,7};

std::vector w(a.cbegin(), a.cend());
Run Code Online (Sandbox Code Playgroud)

请注意,括号对于初始化非常重要w,用大括号替换它们会产生完全不同的结果。

您还可以将上述构造函数调用分解为单独的帮助器模板:

template <class T, std::size_t N>
auto toVec(const std::array<T, N> a)
{
   return std::vector(a.cbegin(), a.cend());
}
Run Code Online (Sandbox Code Playgroud)

这允许初始化为

std::vector w = toVec(a);
Run Code Online (Sandbox Code Playgroud)