考虑类型A:

template <typename T, size_t N>
struct A
{
    T arr[N];
};

C++ 17用户定义的deduction guides之间有什么区别
template <typename T, typename ... Ts>
A(const T&, const Ts& ...) -> A<T, 1 + sizeof...(Ts)>;


template <typename T, typename ... Ts>
A(T, Ts ...) -> A<T, 1 + sizeof...(Ts)>;



或者,换句话说,const引用和推导指南中的值之间有什么区别吗?

请注意,问题不在于模板函数类型的推导,而在于新的C++ 17功能,即用于类模板参数推论的用户定义的推导指南,因此您可以简单地声明A instance{1,2,3}而不是A<int, 3> instance{1,2,3}

最佳答案



就您而言,也许不是,但是总的来说是。

T无法复制时。

在以下示例中,第一种情况(常量引用)编译接收到std::unique_ptr<int>,第二种情况(值)给出错误

#include <iostream>
#include <memory>

template <typename T, size_t N>
struct A
 { template <typename ... Ts> A (Ts const & ...) {} };

template <typename T, size_t N>
struct B
 { template <typename ... Ts> B (Ts const & ...) {} };

template <typename T, typename ... Ts>
A(T const &, Ts const & ...) -> A<T, 1U + sizeof...(Ts)>;

template <typename T, typename ... Ts>
B(T, Ts ...) -> B<T, 1 + sizeof...(Ts)>;


int main()
 {
   std::unique_ptr<int> up;

   auto a = A{up};    // compile
   // auto b = B{up}; // doesn't compile
 }

关于c++ - 推导中引用值与值之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51235025/

10-11 00:22