【问题标题】:Why can't templates be deprecated with [[deprecated]]?为什么不能用 [[deprecated]] 弃用模板?
【发布时间】:2014-09-22 22:45:21
【问题描述】:

C++14 允许将[[deprecated]] 属性应用于(根据 7.6.5/2)“类的声明、类型定义名称、变量、非静态数据成员、函数、枚举或模板特化。”值得注意的是缺少模板。所以给定一个模板:

template<class T>
class MyOldRefCountingPointer {
    ...
};

我可以弃用,比如说,MyOldRefCountingPointer&lt;void&gt;

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

但我不能弃用通用模板:

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

为什么不允许弃用模板?

更新

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

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

template<template<class> class C = OldClass>   // use deprecated template as
void f()                                       // default template parameter
{
}

g++ 和 Clang 都不会在此处发出警告。 Example at Coliru.

【问题讨论】:

    标签: c++ templates c++14 deprecated


    【解决方案1】:

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

    template<typename T> struct [[deprecated]] C { ... };
    

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

    template<typename T> struct C<T*> { ... };
    

    ...然后C&lt;int&gt; 被弃用,但C&lt;int*&gt; 不是。

    支持弃用模板的自然方法是允许在 template-declaration 上添加 attribute-specifier-seq

    [[attribute]] template<typename T> struct C { ... };
    

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

    【讨论】:

    • 投反对票,抱歉,因为问题是关于为什么模板不能被弃用。
    • @KnowItAllWannabe 没有更好的理由,抱歉。没有人提议允许模板上的属性,也没有人提议允许模板被弃用。语言功能的默认状态是“不存在”。这个答案解释了为什么它不是 [[deprecated]] 属性的结果。
    【解决方案2】:

    我很确定它属于一般不推荐使用的类(对于可以模板化的所有其他内容也是如此)。

    不管怎样,g++ 和 clang++ 都没有抱怨:coliru

    【讨论】:

    • 有趣。因此类和函数模板包含在类和函数中,但函数模板特化不包含在函数中。很奇怪。
    • 嗯...我原以为它属于 specialization 部分。 À la “模板本身并没有被弃用,而是它产生的所有特化。”
    • @KnowItAllWannabe 您可以弃用模板类(它们是类)和模板函数(它们是函数),但不能弃用类模板(它们不是类,它们是模板)或函数模板(它们不是函数,它们是模板)。
    • 我已取消选择 Deduplicator 的答案作为已接受的解决方案,因为额外的测试(由 R. Martinho Fernandes 的评论提示)使我找到了几种方法来使用具有 [[deprecated]] 属性的模板而没有获得使用 g++ 4.9.1 或 Clang 3.6 发出警告。例如,此类模板可以用作模板模板参数的默认值,也可以获取指向已弃用模板类的成员函数(静态或非静态)的指针。所以看来我的问题是:为什么 can't 模板被弃用?
    • @KnowItAllWannabe:请添加您的发现。此外,指向 Coliru、ideone 或其他一些在线编译器的链接会很好。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2019-11-16
    • 2019-08-14
    相关资源
    最近更新 更多