我正在编译以下代码并且GCC似乎接受以下代码。
#include <map>
template<typename K, typename V>
class my_map {
private:
std::map<K, V> mmap;
public:
typedef std::map<K, V>::iterator iterator;
typedef std::map<K, V>::const_iterator const_iterator;
iterator begin() {return mmap.begin();}
const_iterator begin() const {return mmap.begin();}
};
int main()
{
my_map<int, int>::iterator whatever;
return 0;
}
But clang抱怨失踪typename
关键词。
clang 的抱怨对我来说更有意义。这是海湾合作委员会的错误吗?
Edit: 明显地,我必须在哪里以及为什么必须放置“template”和“typename”关键字? does not回答我的问题,因为我不是在问什么typename
关键字是,但询问编译器的不同行为。
Edit:现在该程序已被 clang(从版本 16 开始)和 gcc 都接受。
询问编译器的不同行为。
看来 Clang 还没有实现这个 C++20 功能。这可以从编译器支持文档。这意味着 clang 是不符合标准.
C++20 feature |
Paper(s) |
GCC |
Clang |
MSVC |
Apple Clang |
Allow lambda-capture [=, this] |
P0409R2 |
8 |
6 |
19.22* |
10.0.0* |
Make typename more optional |
P0634R3 |
9 |
|
19.29 (16.10)* |
|
Pack expansion in lambda init-capture |
P0780R2 |
9 |
9 |
19.22* |
11.0.3* |
正如我们在上表中看到的,与“使 typename 更可选”对应的 clang 条目是空白的。
另一方面,GCC 和 MSVC 已经实现了这个 C++20 功能,因此符合标准. GCC 和 MSVC 演示
Update
截至 2022 年 3 月 11 日,clang 支持此功能版本16如下更新后的表格所示:
C++20 feature |
Paper(s) |
GCC |
Clang |
MSVC |
Apple Clang |
Allow lambda-capture [=, this] |
P0409R2 |
8 |
6 |
19.22* |
10.0.0* |
Make typename more optional |
P0634R3 |
9 |
16 |
19.29 (16.10)* |
|
Pack expansion in lambda init-capture |
P0780R2 |
9 |
9 |
19.22* |
11.0.3* |
该程序使用 clang trunk 进行编译.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)