示例:
#include <type_traits>
template<bool condition>
struct X {
template<std::enable_if_t<condition, bool> = true>
using MaybeInt = int;
template<std::enable_if_t<condition, bool> = true>
static MaybeInt<> MaybeResult() {
return 0;
}
};
int main() {
return X<true>::MaybeResult();
}
是否可以使用末尾没有空尖括号的
X<true>::MaybeInt
类型?如果没有,为什么?
如果我只是在第 9 行删除它们,C++17 中的 clang++ 会给出以下错误:
main.cpp:9:12: error: use of alias template 'MaybeInt' requires template arguments; argument deduction not allowed in function return type
static MaybeInt MaybeResult() {
^~~~~~~~
main.cpp:6:5: note: template is declared here
using MaybeInt = int;
^
1 error generated.
为什么不允许这样做?
不,在类或别名模板名称上省略模板参数列表与空模板参数列表具有不同的含义。
使用空的模板参数列表,整个事物命名一个单一类型,该类型是通过使用模板参数的所有默认模板参数获得的特化。
如果没有模板参数列表,该名称向编译器指示要执行类模板参数推导 (CTAD) 来确定模板参数。
然而,正如编译器告诉您的那样,CTAD 仅在特定上下文中允许,并且函数返回类型不是其中之一。