考虑类型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/