c++ - typename 必须在模板内指定吗?

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

看来 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/

相关文章:

c++ - 传递给 std::for_each 的函数是否允许复制序列元素?

c++ - (C++) For 循环 - 为什么要这样做?

c++ - 并行使用主 DNS 服务器和辅助 DNS 服务器进行名称解析

c++ - 访问基类型数组成员(Int-to-Type 习语)

c++ - 什么时候画画合适?

javascript - 如何将 CSS 样式应用于 AJAX 调用后呈现的内容

用于大型 HTML/XML 的 Python 模板

c++ - 模板参数推导/替换失败

c++ - 为什么 malloc 在全局命名空间中?

c++ - 模板参数包如何同时具有显式参数和推导参数?