【问题标题】:Does typename have to be specified inside template?typename 必须在模板中指定吗?
【发布时间】:2020-08-30 05:49:23
【问题描述】:

似乎 GCC 不需要在模板中指定类型名,而 Clang 则需要。

考虑以下代码sn-p:

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 的第一个怀疑是Clang 目前不支持P0634R3 的一个功能。

更新 2:

我将把这个问题分开,因为它包含两个不同的主题。

有关详细信息,请参阅编辑历史记录。

【问题讨论】:

  • clang.llvm.org/cxx_status.html#cxx20 表示 Clang 尚不支持 P0634R3
  • @LanguageLawyer 立即清除。所以typename 不是一个错误,而是一个尚未在 Clang 中发布的功能。
  • @LanguageLawyer 我可以接受您的回答,因为问题标题仅显示typename。也许我可以为第二个问题发布另一个问题。

标签: c++ templates language-lawyer c++20


【解决方案1】:

C++20 消除了在特定情况下为依赖模板名称指定 typename 的需要,在这些情况下,很明显指定的内容必须是类型名。比如a template parameter's default value when that parameter has already specified that it is a typename:

如果限定名称出现在 [...] 模板类型参数的默认参数中,则称其位于仅类型 ID 上下文中,[...]

Clang has not yet implemented this feature,但 GCC 有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2012-10-28
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多