【发布时间】:2021-09-22 02:30:30
【问题描述】:
当我看到这篇文章时,我正在阅读别人的代码(剥离到 MWE):
template<typename R> class Test {
public:
typedef R R;
};
这里有一个模板参数typedef给自己,它让GCC和clang(有或没有-std=c++2a)抱怨:
test.cc:3:19: 错误:'typedef R Test::R' 阴影模板参数的声明
但是,Compiler Explorer 上的 ICC 和 MSVC 都接受该片段。
我读过this question,建议给self 一个typedef 通常是无操作的。但是,这里似乎并非如此。我还发现 this question 是相关的,但我认为它们应该不同,因为我们在这里使用的是 typedef。
所以问题来了:
标准允许这种重新定义吗?
该声明有任何副作用吗?为什么有人会这样写?
【问题讨论】:
-
您可以编写它来将
R暴露给其他知道Test的实例化但不一定知道R是什么的东西。就像std::vector<T>拥有std::vector<T>::value_type。 -
@LanguageLawyer 糟糕,我以为我很小心。不过还是要感谢大家。
标签: c++ templates language-lawyer typedef noop