为什么使用推导类类型的占位符聚合初始化非类型模板参数无法编译?

md1*_*357 7 c++ metaprogramming language-lawyer c++20

考虑以下代码:

struct Base_string { char data[1 << 5]; };

template<typename Base>
struct Derived: Base { };

Derived(char const*) -> Derived<Base_string>;

template<Derived>
struct S { };

S<{"Test"}> s; // Error
Run Code Online (Sandbox Code Playgroud)

最后一行被S实例化,无法编译。我希望它能起作用,因为[temp.arg.nontype#1]指出:

如果模板参数的类型 T 包含 [...] 推导类类型的占位符,则参数的类型是为发明声明中的变量 x 推导的类型T x = template-argument;

就我而言,这个发明的声明看起来像这样:Derived x = {"Test"};,并且实际上在程序中声明这样的变量不会产生错误 - 类型被正确推导。
另外,我认为问题不在于聚合初始化语法本身 - 将模板的定义更改S为:

template<Base_string>
struct S { };
Run Code Online (Sandbox Code Playgroud)

并以相同的方式实例化它 ( S<{"Test"}> s;) 不会产生错误。

我知道我可以简单地显式指定类型,如下所示:S<Derived{"Test"}> s;,但我不是在寻找解决方法,我想了解为什么推导在这里失败。