具有默认自变量的模板类型是否支持在其他模板类型声明中使用的类模板自变量推导?以下代码无法同时使用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
可解决此问题,但我对此感到有些惊讶。这是编译器问题还是已知的语言限制?
答案 0 :(得分:5)
编译器必须验证传递给模板的内容是否与预期的模板参数匹配。现在考虑我将用您的示例编写此代码,而您看不到foo
:
foo<C> f;
它是CTAD的实例,还是我自己传递了模板?因为一个人已经可以将模板作为参数传递给其他模板。
template< template<typename> class T > struct foo {};
在该上下文中允许CTAD将依赖于C
上下文的使用。相反,在声明变量时,模板名称没有其他用途。编写时没有歧义...
C c;
...可能意味着CTAD以外的其他内容,因此允许在这里使用。但是,当模板名称用作模板参数时,上下文很重要。 C ++已经有很多上下文相关的构造,因此添加更多通常不是一个好主意。