为什么不能使用[[deprecated]]弃用模板?

时间:2014-09-22 22:45:22

标签: deprecated c++14

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

2 个答案:

答案 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