Ton*_*vel 4 c++ templates optional c++17
具有在其他模板类型声明中使用的默认参数的模板类型是否支持类模板参数推导?以下代码无法同时使用Clang / GCC干线进行编译,因此在定义行上失败y:
#include <optional>
template <class T = char>
struct C {};
int main() {
C x;
std::optional<C> y;
}
Run Code Online (Sandbox Code Playgroud)
(https://godbolt.org/z/SgxY90)
修改代码以读取std::optional<C<>> y可解决此问题,但我对此感到有些惊讶。这是编译器问题还是已知语言限制?
编译器必须验证传递给模板的内容是否与预期的模板参数匹配。现在考虑我将用您的示例编写此代码,而您没有看到foo:
foo<C> f;
Run Code Online (Sandbox Code Playgroud)
它是CTAD的实例,还是我自己传递了模板?因为已经可以将模板作为参数传递给其他模板。
template< template<typename> class T > struct foo {};
Run Code Online (Sandbox Code Playgroud)
在这种情况下允许使用CTAD将C取决于上下文的使用。相反,在声明变量时,模板名称没有其他用途。写作时没有歧义...
C c;
Run Code Online (Sandbox Code Playgroud)
...可能意味着CTAD 以外的其他内容,因此这里允许。但是,当模板名称用作模板参数时,上下文很重要。C ++已经有很多上下文相关的构造,因此添加更多通常不是一个好主意。
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |