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

Kno*_*abe 7 c++ templates deprecated c++14

C++ 14允许将[[deprecated]]属性应用于(根据7.6.5/2)"类的声明,typedef-name,变量,非静态数据成员,函数,枚举或模板专业化." 值得注意的是缺少模板.所以给出一个模板:

template<class T>
class MyOldRefCountingPointer {
    ...
};
Run Code Online (Sandbox Code Playgroud)

我可以弃用,比方说MyOldRefCountingPointer<void>,

template<>
class
[[deprecated ("Use std::shared_ptr<void> instead of MyOldRefCountingPointer")]]
MyOldRefCountingPointer<void> {
    ...
};
Run Code Online (Sandbox Code Playgroud)

但我不能弃用一般模板:

template<class T>
class
[[deprecated ("Use std::shared_ptr instead of MyOldRefCountingPointer")]]
MyOldRefCountingPointer {
    ...
};
Run Code Online (Sandbox Code Playgroud)

是什么原因导致不允许弃用模板?

更新

如何在不产生警告的情况下使用已弃用的模板的示例如下:

template<class T>
class
[[deprecated]]
OldClass {};

template<template<class> class C = OldClass>   // use deprecated template as
void f()                                       // default template parameter
{
}
Run Code Online (Sandbox Code Playgroud)

g ++和Clang都没有在这里发出警告.Coliru的例子.

Ric*_*ith 7

在C++ 11和C++ 14中,属性不能与模板相关.鉴于:

template<typename T> struct [[deprecated]] C { ... };
Run Code Online (Sandbox Code Playgroud)

[[deprecated]]属于从模板实例化的类,而不是模板本身.特别是,如果你这样写:

template<typename T> struct C<T*> { ... };
Run Code Online (Sandbox Code Playgroud)

...然后C<int>被弃用,但事实C<int*>并非如此.

支持弃用模板的自然方法是在模板声明上允许attribute-specifier-seq:

[[attribute]] template<typename T> struct C { ... };
Run Code Online (Sandbox Code Playgroud)

...但目前不支持该语法,到目前为止还没有提议添加它.

  • @KnowItAllWannabe没有更好的理由,抱歉.没有人建议允许模板上的属性,没有人建议允许模板被弃用.语言功能的默认状态是"不存在".这个答案解释了为什么它不是`[[deprecated]]`属性的结果. (6认同)
  • 抱歉,被否决了,因为问题是关于*为什么*模板不能被弃用。 (2认同)

Ded*_*tor 2

我很确定这属于一般性的弃用类(对于可以模板化的其他所有内容也是如此)。

无论如何,g++ 和 clang++ 都没有抱怨:coliru

  • @KnowItAllWannabe 您可以弃用模板类(它们是类)和模板函数(它们是函数),但您不能弃用类模板(它们不是类,它们是模板)或函数模板(它们不是函数,它们是模板)。 (3认同)