【发布时间】:2018-10-12 15:38:47
【问题描述】:
当所有参数都有默认值时,C++17 似乎添加了在模板类上删除“”的功能(就像我们长期以来一直能够使用函数一样)例如:
template<int LENGTH = 1>
struct MyStruct{ int arr[LENGTH]; };
int main()
{
MyStruct<2> a;
MyStruct<> b; // old way to use defaults
MyStruct c; // new way to use defaults
return 0;
}
但是,当使用别名模板时,该功能似乎不再起作用,例如:
template<int LENGTH = 1>
struct MyStruct{ int arr[LENGTH]; };
template<int LENGTH = 1>
using MyAlias = MyStruct<LENGTH>;
int main()
{
MyAlias<2> a;
MyAlias<> b; // old way still works
MyAlias c; // new way doesn't compile:
// gcc 7.3: missing template arguments before 'c'
// clang 6.0.0: declaration of variable 'c' with deduced type 'MyAlias' requires an initializer
return 0;
}
这对我来说似乎是出乎意料的行为。是否有任何解决方法仍然允许删除“”? (我知道可以使用不同的名称创建单独的 typedef,例如:使用 MyAlias2 = MyStruct,但我想要相同的确切名称。我也知道定义可以欺骗它,例如 #define MyAlias MyStruct,但假设会只能作为最后的手段。)
【问题讨论】:
-
Afaik,唯一的方法是你提到的宏。现在的问题是,我多么迫切地希望代表将其发布为答案?嗯..... ;)
-
实际上,我也不知道定义是如何工作的godbolt
-
@iPherian 当前版本 19.10 的 MSVC 用于 Godbolt doesn't support template argument deduction。
标签: c++ class templates alias c++17