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不接受这一点:
错误:模板专业化或离线模板定义中的无关模板参数列表
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:
用户定义的推导指南的语法是带有尾随返回类型的函数声明的语法。推导指南不是函数[...]
请注意,它具有声明而不是专门化的语法。这与您的预期有所不同。