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的例子.
在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)
...但目前不支持该语法,到目前为止还没有提议添加它.
归档时间: |
|
查看次数: |
514 次 |
最近记录: |