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++ 已经有很多上下文相关的结构,所以添加更多通常不是一个好主意。