在模板类型中使用 decltype 时模板专业化失败

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++ 可能已经改变。

son*_*yao 5

因为模板参数推导由于未推导上下文而无法工作。

如果模板参数仅在非推导上下文中使用并且未显式指定,则模板参数推导将失败。

  1. decltype-specifier 的表达式:

    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
    
    Run Code Online (Sandbox Code Playgroud)

第二个代码片段并不完全相同,因为不涉及模板参数推导。