Class 模板类型的模板参数推导,它本身就是模板的参数
Class template argument deduction for template type which is itself an argument for a template
对于在另一个模板类型声明中使用的具有默认参数的模板类型,是否支持 class 模板参数推导?以下代码无法同时使用 Clang/GCC 主干进行编译,它在定义 y
:
的行上失败
#include <optional>
template <class T = char>
struct C {};
int main() {
C x;
std::optional<C> y;
}
(https://godbolt.org/z/SgxY90)
修改代码以读取 std::optional<C<>> y
解决了这个问题,但我有点惊讶这是需要的。这是编译器问题,还是已知的语言限制?
编译器必须验证传递给模板的内容是否与预期的模板参数匹配。现在考虑我要用你的例子写这个,你看不到 foo
:
foo<C> f;
它是 CTAD 的一个实例,还是我传递的是模板本身?因为已经可以将模板作为参数传递给其他模板。
template< template<typename> class T > struct foo {};
在该上下文中允许 CTAD 将使 C
的使用依赖于上下文。相反,模板名称在声明变量时没有其他用途。写的时候没有歧义...
C c;
...这可能意味着 不同于 CTAD,因此此处允许。但是当模板名称用作模板参数时,上下文很重要。 C++ 已经有很多上下文相关的结构,所以添加更多通常不是一个好主意。
对于在另一个模板类型声明中使用的具有默认参数的模板类型,是否支持 class 模板参数推导?以下代码无法同时使用 Clang/GCC 主干进行编译,它在定义 y
:
#include <optional>
template <class T = char>
struct C {};
int main() {
C x;
std::optional<C> y;
}
(https://godbolt.org/z/SgxY90)
修改代码以读取 std::optional<C<>> y
解决了这个问题,但我有点惊讶这是需要的。这是编译器问题,还是已知的语言限制?
编译器必须验证传递给模板的内容是否与预期的模板参数匹配。现在考虑我要用你的例子写这个,你看不到 foo
:
foo<C> f;
它是 CTAD 的一个实例,还是我传递的是模板本身?因为已经可以将模板作为参数传递给其他模板。
template< template<typename> class T > struct foo {};
在该上下文中允许 CTAD 将使 C
的使用依赖于上下文。相反,模板名称在声明变量时没有其他用途。写的时候没有歧义...
C c;
...这可能意味着 不同于 CTAD,因此此处允许。但是当模板名称用作模板参数时,上下文很重要。 C++ 已经有很多上下文相关的结构,所以添加更多通常不是一个好主意。