C ++ 14允许[[deprecated]]
属性应用于(按7.6.5 / 2)“类的声明,typedef-name,变量,非静态数据成员,a函数,枚举或模板专业化。“值得注意的是缺少模板。所以给出了一个模板:
template<typename T>
class MyOldRefCountingPointer {
...
};
我可以弃用,例如MyOldRefCountingPointer<void>
,
template<>
class
[[deprecated ("Use std::shared_ptr<void> instead of MyOldRefCountingPointer")]]
MyOldRefCountingPointer<void> {
...
};
但我不能弃用一般模板:
template<typename T>
class
[[deprecated ("Use std::shared_ptr instead of MyOldRefCountingPointer")]]
MyOldRefCountingPointer {
...
};
不允许弃用模板的原因是什么?
如何在不产生警告的情况下使用已弃用的模板的示例如下:
template<typename T>
class
[[deprecated]]
OldClass {};
template<template<typename> class C = OldClass> // use deprecated template as
void f() // default template parameter
{
}
g ++和Clang都没有发出警告。 Example at Coliru
答案 0 :(得分:5)
在C ++ 11和C ++ 14中,属性不能附加到模板。给出:
template<typename T> struct [[deprecated]] C { ... };
[[deprecated]]
附属于从模板实例化的类,不到模板本身。特别是,如果你这样写:
template<typename T> struct C<T*> { ... };
...然后{@ 1}}已被弃用,但C<int>
不是。
支持弃用模板的自然方法是在模板声明上允许 attribute-specifier-seq :
C<int*>
...但目前不支持该语法,到目前为止还没有提议添加它。
答案 1 :(得分:1)
我非常肯定属于一般弃用某个类(对于其他可以模板化的东西也是如此)。
无论如何,g ++和clang ++都没有抱怨:coliru