【问题标题】:Initialize deprecated field without tripping warning初始化不推荐使用的字段而不发出跳闸警告
【发布时间】:2022-11-24 05:18:45
【问题描述】:

我有一个带有我想弃用的静态字段的结构。但是,现在我仍然想初始化它。以下 sn-p 在 MSVC 和 GCC(但不是 Clang)下产生警告:

struct A {
    ~A();
};

struct B {
    [[deprecated]] static A X;
};

A B::X; //warning C4996: 'B::X': was declared deprecated

有趣的是,如果我删除~A();,警告就会消失。

有没有办法在不产生警告的情况下初始化B::X,而不诉诸 hacky pragmas 之类的?

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    当您删除析构函数时警告消失,因为 A 可以被简单地破坏(也可以构造),这意味着编译器不需要发出实际代码来初始化任何东西,因此不会生成引用 B::X 的代码.因此,没有触发器发出警告。

    这也暗示了一个可能的解决方法:使 B::X 变得“微不足道”,例如一个参考。例如(直播godbolt):

    struct A {
        ~A();
    };
    
    struct B {
      static A helper;
      [[deprecated]] static A & X;
    };
    
    A B::helper;
    A & B::X = B::helper;
    

    这不会产生警告,只会在实际使用的地方产生警告。在大多数情况下,此解决方法不应更改程序的语义。

    作为旁注,静态成员按照其定义的顺序进行初始化,请参见例如this answer

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2019-09-21
      • 2016-09-19
      • 2012-12-17
      • 2015-02-26
      相关资源
      最近更新 更多