考虑代码:
#include <memory>
template <class T, class Deleter = std::default_delete<T>>
class unique_ptr_wrapper: public std::unique_ptr<T, Deleter>
{
public:
using typename std::unique_ptr<T, Deleter>::unique_ptr;
operator T* () const {return this->get();}
};
int main()
{
unique_ptr_wrapper<int> upw{new int{42}};
}
g++5.1 编译得很好,尽管 clang++ 抱怨
错误:类型名仅适用于标识符
我同意我们这里没有标识符,所以可能typename
不需要。但实际上是禁止的吗?编译器是否至少需要发出诊断信息?
EDIT代码编译得很好,没有typename
由 g++ 和 clang++ 提供。
UPDATE这似乎是一个 g++ bug,我报告了它here https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66350.
[class.inhctor]/p1,我的重点:
A 使用声明(7.3.3)命名一个构造函数隐含地
声明了一组继承构造函数.
构造函数不是类型。
[温度资源]/p3-4:
3 当合格的 ID旨在指代不是一个类型
当前实例化的成员(14.6.2.1)及其嵌套名称说明符引用一个依赖类型,它应该以关键字作为前缀typename
,形成类型名称说明符。如果
这合格的 ID in a 类型名称说明符不表示类型,
该程序格式不正确。
4 如果模板的特化被实例化为一组模板参数使得合格的 ID前缀为typename
不表示类型,专业化格式不正确。
通常的限定名称查找(3.4.3)用于查找合格的 ID即使在存在的情况下typename
.
[class.qual]/p2:
在不忽略函数名称并且嵌套名称说明符提名一个班级C
:
如果在后面指定的名称嵌套名称说明符,当抬头时C
, 是个注入类名 of C
(第 9 条),或
in a 使用声明(7.3.3) 即会员声明,如果在后面指定的名称嵌套名称说明符是相同的
这标识符 or the 简单模板 ID’s 模板名称在里面
的最后一个组成部分嵌套名称说明符,
该名称被认为是类的构造函数的名称C
.
应用[class.qual]中的“通常限定名称查找”规则,std::unique_ptr<T, Deleter>::unique_ptr
命名构造函数。它不表示类型。因此,根据上面引用的[temp.res],该程序格式不正确(需要诊断)。
换句话说,这似乎是一个 GCC 错误(尽管 Clang 的错误消息也可以进行一些改进)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)