弃用使用模板别名(类型别名,using)的模板类名称?

8

我想重命名一个模板类。为了让用户更容易过渡,我希望在下一个版本中保留旧类,并使用来自GCC / Clang的扩展属性(deprecated)标记它已弃用。 为了避免保留废弃类的完全副本,模板别名的使用将非常方便。不幸的是,它似乎不起作用。这是我在Clang 3.3、GCC 4.7和GCC 4.8上尝试的:

template <class blabla>
struct NewClassName
{
    // ...
};

template <class blabla> using OldClassName [[deprecated]]
  = NewClassName<blabla>;

我是否遗漏了些什么,或者编译器不支持这个?有没有其他的想法可以在不复制整个类的情况下获取弃用警告?


1
它在4.8和4.7中运行良好,并产生弃用警告。现场代码 - masoud
你是对的,我正在使用稍微复杂一些的例子进行测试,它适用于4.7及更高版本。不幸的是,Clang 3.3会发出一个错误。 - usr1234567
2
我会向Clang提交一个Bug。 - n. m.
1
@n.m.:是的,看起来像是一个bug,但这只是一个扩展,他们并没有承诺它能与“using”一起使用。请参见此处 - masoud
1个回答

7
自GCC 4.9版本开始(在4.7版本中使用__attribute__(deprecated)),支持废弃模板别名。这是一个比较typedef和模板别名的测试案例:
template <class T>
struct NewClassName
{
    // ...
};

template <class T> using OldClassNameUsing [[deprecated]]
  = NewClassName<T>;

typedef NewClassName<int> OldClassNameTypedef [[deprecated]];

int main()
{
  OldClassNameUsing<int> objectUsing;
  OldClassNameTypedef objectTypedef;

  return 0;
}

它对我无效的原因是我没有创建OldClassNameUsing对象,而是访问了静态成员,例如OldClassNameUsing::myFunction()。除非函数本身已被弃用,否则这永远不会触发弃用警告。
Clang还不支持弃用模板别名——在版本13中进行了测试。相应的功能请求为https://github.com/llvm/llvm-project/issues/18236

谢谢,对我来说在Clang 3.4.1+中似乎可以工作(包括4.0.0),并且支持C++11:https://godbolt.org/z/5CsB4v - Ax3l
@Ax3l 不是因为 using,而是因为 typedef 才会收到警告。后者是必需的以保留模板。 - usr1234567

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接