如何使用模板化构造函数定义推导指南?

JVA*_*pen 0 c++ templates c++17 ctad

为了简化我的问题,我将使用它std::unique_lock作为解释工具。std :: unique_lock有一个模板参数,互斥体。但是,它的构造函数也是模板函数unique_lock(TMutex &, const chrono::duration<_Rep, _Period>&)

当一个人使用它时,可以写:

 auto lock = std::unique_lock(my_mutex, 5s);
Run Code Online (Sandbox Code Playgroud)

那么,问题是:如何为此写出演绎指南(不改变行为),怎么做?

到目前为止,我最大的尝试是:

template<typename _Mutex>
template<typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;
Run Code Online (Sandbox Code Playgroud)

不幸的是,clang不接受这一点:

错误:模板专业化或离线模板定义中的无关模板参数列表

Joe*_*lho 5

GCC为此有一个更好的错误消息:

错误:模板参数列表过多

您可以将其更改为单个模板参数列表,如下所示:

template<typename _Mutex, typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;
Run Code Online (Sandbox Code Playgroud)

而且有效。

从问题中的评论来看,您似乎在混合CTAD和专业知识。

您不会专门从事unique_lock。不是成员函数,也不是构造函数,您只是在定义一个推导指南。更具体地说,来自cppreference

用户定义的推导指南的语法是带有尾随返回类型的函数声明的语法。推导指南不是函数[...]

请注意,它具有声明而不是专门化的语法。这与您的预期有所不同。