gpt4 book ai didi

c++ - 没有尖括号的模板类实例化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:32 25 4
gpt4 key购买 nike

我想知道这段代码是否合法(当然在 C++17 中):

template<typename T = int>
class C {};

int main() {
C c;
}

这在 GCC 8.1.0 上编译良好,但在 Clang 6.0.0 上编译失败。我试图在标准中找到答案,但我不是语言律师,我无法弄清楚。另一方面,cppreference声明如下:

std::less l;             // same as std::less<void> l;

那么,是否可以定义一个对象,其类型是一个模板类,其中所有模板参数都有一个默认值,而不使用尖括号

编辑

我试图澄清我的疑问:我的代码,稍作修改,即将 main 的主体更改为

C<> c;

是来自 C++98 的合法代码。在 C++17 标准中,我们可能会争辩说,在这种情况下,空尖括号 不再是强制性的?

最佳答案

So, is it possible to define an object, whose type is a template class where all template parameters have got a default, without using the square brackets?

简短的回答是肯定的。整个机制类似于(实际上是基于)函数模板参数推导。在推导类模板的模板参数时,推导指南(用户提供的和编译器生成的)通过重载解析过程被考虑,类似于我们对函数调用的处理。

所以你可以做你想做的事,因为同样的原因这是有效的:

template<typename T = void>
void foo() {}

int main() {
foo();
}

我们调用 foo 时没有尖括号,Tvoid 因为它不是推导出来的,必须从默认参数中获取.

关于c++ - 没有尖括号的模板类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50969023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com