【发布时间】:2017-03-08 11:30:08
【问题描述】:
在指定所有模板参数都具有默认值的模板类时,为什么需要<> 有充分的理由吗?
例如
#include <iostream>
template<typename T = int>
class C {
public:
T obj = 0;
};
int main()
{
C c1; // Error on almost all compilers (see note below)
C<> c2;
std::cout << c1.obj << " " << c2.obj << std::endl;
return 0;
}
这样做的一个缺点是,如果你有一个已经在不同地方使用过的类,然后你将它重构为一个类模板,它的模板参数具有默认参数,那么你必须在其中添加 <>所有使用该类的地方。
注意:它看起来像 GCC 最新的 HEAD (7.0.1) accepts 没有<> 的语法。早期版本没有,任何版本的 Clang 也没有。这是最新的 GCC HEAD 中的错误吗?或者也许 C++17 的标准现在接受没有 <> 的语法,而 GCC 就在前面?
【问题讨论】:
-
C c1{};在最新的 clang 上编译。 -
This answer 解释了为什么需要
<>- 简而言之,这是为了避免模板和类型之间的歧义。 -
"或者也许 C++17 的标准现在接受不带 " 的语法,在 C++17 中有类模板推导发生在这里
-
@PiotrSkotnicki 欢迎作为答案发布。
-
@Danra 但我不知道之前不允许模板名称作为类型说明符的确切原因(除了原因)