C++ 为什么可以';t是否使用[[已弃用]]弃用模板?

C++ 为什么可以';t是否使用[[已弃用]]弃用模板?,c++,templates,c++14,deprecated,C++,Templates,C++14,Deprecated,C++14允许将[[deprecated]]属性应用于(根据7.6.5/2)“类、typedef名称、变量、非静态数据成员、函数、枚举或模板专用化的声明”。模板明显缺失。因此,给定一个模板: template<class T> class MyOldRefCountingPointer { ... }; template<class T> class [[deprecated ("Use std::shared_ptr instead of MyOld

C++14允许将
[[deprecated]]
属性应用于(根据7.6.5/2)“类、typedef名称、变量、非静态数据成员、函数、枚举或模板专用化的声明”。模板明显缺失。因此,给定一个模板:

template<class T>
class MyOldRefCountingPointer {
    ...
};
template<class T>
class
[[deprecated ("Use std::shared_ptr instead of MyOldRefCountingPointer")]]
MyOldRefCountingPointer {
    ...
};
模板
类MyOldRefCountingPointer{
...
};
我可以反对,比如说,
MyOldRefCountingPointer

模板
班
[[已弃用(“使用std::shared\u ptr代替MyOldRefCountingPointer”)]]
MyOldRefCountingPointer{
...
};
但我不能反对通用模板:

template<class T>
class MyOldRefCountingPointer {
    ...
};
template<class T>
class
[[deprecated ("Use std::shared_ptr instead of MyOldRefCountingPointer")]]
MyOldRefCountingPointer {
    ...
};
模板
班
[[已弃用(“使用std::shared\u ptr代替MyOldRefCountingPointer”)]]
MyOldRefCountingPointer{
...
};
为什么不允许弃用模板

更新 如何使用不推荐使用的模板而不产生警告的示例如下:

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

template<template<class> class C = OldClass>   // use deprecated template as
void f()                                       // default template parameter
{
}
模板
班
[[已弃用]]
旧类{};
模板//将不推荐使用的模板用作
void f()//默认模板参数
{
}

g++和Clang都不会在此处发出警告

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


无论如何,g++和clang++都不会抱怨:

在C++11和C++14中,属性不能属于模板。鉴于:

template struct[[deprecated]]C{…};
[[deprecated]]
属于从模板实例化的类,而不是模板本身。特别是,如果您写下以下内容:

模板结构C{…};
。。。然后不推荐使用
C
,但
C
不是

支持模板弃用的自然方法是允许在模板声明中使用属性说明符seq:

[[attribute]]模板结构C{…};

。。。但这种语法目前不受支持,到目前为止还没有添加它的建议。

有趣。所以类和函数模板包含在类和函数中,但函数模板的专门化不包含在函数中。奇怪,嗯。。。我本以为它属于专门化部分。Àla“模板本身并没有被弃用,但它产生的所有专门化。”@KnowitAllWannab您可以弃用模板类(它们是类)和模板函数(它们是函数),但您不能弃用类模板(它们不是类,它们是模板)或函数模板(它们不是函数,它们是模板)。我没有选择Duplicator的答案作为可接受的解决方案,因为额外的测试(由R.Martinho Fernandes的评论提示)使我找到了几种方法来使用带有
[[deprecated]]
属性的模板,而不会在g++4.9.1或Clang 3.6中得到警告。例如,此类模板可以用作模板参数的默认值,还可以获取指向已弃用模板类的成员函数(静态或非静态)的指针。看来我的问题是:为什么模板不能被弃用?@KnowItAllWannabe:请添加您的发现。此外,一个指向Coliru、ideone或其他联机编译器的链接,显示它们也不错。对不起,投了反对票,因为问题是为什么模板不能被弃用。@knowitallwanbe没有更好的理由,对不起。没有人建议允许模板上的属性,也没有人建议不推荐使用模板。语言功能的默认状态为“不存在”。这个答案解释了为什么它不是
[[deprecated]]
属性的结果。