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;,但我不是在寻找解决方法,我想了解为什么推导在这里失败。