edr*_*zen 2 c++ decltype template-specialization c++20
我定义了以下模板结构:
template<typename T> struct somestruct {};
Run Code Online (Sandbox Code Playgroud)
现在有以下专业:
template<typename T> struct somestruct <std::vector<T>> {}; // OK
template<typename T> struct somestruct <decltype(std::vector<T> {})> {}; // KO
Run Code Online (Sandbox Code Playgroud)
但是,最后一个专业化不会编译并出现以下错误(请参阅此处):
error: template parameters not deducible in partial specialization:
Run Code Online (Sandbox Code Playgroud)
天真地,我会说这两个专业并没有那么不同,就像下面这样:
template<typename T> void test ()
{
static_assert (std::is_same_v<std::vector<T>, decltype(std::vector<T>{})> );
}
Run Code Online (Sandbox Code Playgroud)
问题:导致编译器第二个专业化失败的技术原因是什么?有没有办法解决它(我的意思是我的代码,而不是编译器)?
有一篇旧帖子似乎很相似,但也许 things/compiler/c++ 可能已经改变。
因为模板参数推导由于未推导上下文而无法工作。
如果模板参数仅在非推导上下文中使用并且未显式指定,则模板参数推导将失败。
decltype-specifier 的表达式:
Run Code Online (Sandbox Code Playgroud)template<typename T> void f(decltype(*std::declval<T>()) arg); int n; f<int*>(n); // P = decltype(*declval<T>()), A = int: T is in non-deduced context
第二个代码片段并不完全相同,因为不涉及模板参数推导。