看来 GCC 不需要在模板内指定类型名,而 Clang 则需要。
考虑以下代码片段:
template<
typename T,
typename value_type = T::value_type
>
void func(T t) {}
当 Clang 报告以下错误消息时,上面的代码在 GCC 10.0.1 上编译成功:
❯ clang++ -std=c++20 asdf.cpp
asdf.cpp:3:27: error: missing 'typename' prior to dependent type name 'T::value_type'
typename value_type = T::value_type
^~~~~~~~~~~~~
typename
1 error generated.
为什么会这样?
更新1:
正如 @Language Lawyer 所指出的,对 typename
的第一个怀疑是 P0634R3 的一个功能。 Clang 目前不支持。
更新2:
我将把这个问题分开,因为它包含两个不同的主题。
查看编辑历史记录以了解更多详细信息。
最佳答案
C++20 不再需要在特定情况下为依赖模板名称指定typename
,在这些情况下,显然所指定的必须是类型名称。例如,a template parameter's default value when that parameter has already specified that it is a typename
:
A qualified name is said to be in a type-id-only context if it appears in [...] default argument of a type-parameter of a template, [...]
铿锵has not yet implemented this feature ,但 GCC 有。
关于c++ - typename 必须在模板内指定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63654388/