【问题标题】:C++20 Member Initialization List Clang++ vs G++C++20 成员初始化列表 Clang++ vs G++
【发布时间】:2022-01-04 15:03:55
【问题描述】:

当前使用 Clang++ 13.0.0 和 GCC G++ 11.2.0。

以下代码已针对上下文进行了简化。当我使用 g++ 运行代码时,它运行时没有任何警告或错误。当我使用 Clang 运行代码时,出现以下错误:

field 'cat' is uninitialized when used here [-Werror,-Wuninitialized]

有没有办法解决这个问题?

代码:

struct Bar {
    Object *ptr;
    int y;
};

struct Foo {
    Object *ptr;
    Bar cat;
};

class Test {
    Foo animal;

    Test()
    : animal{
          generateObject(),
          {
             animal.ptr,
             0 
          }
      }
    {}
};

【问题讨论】:

  • cat{0, 0} :-)
  • 好吧,cat{0, 0} 将是解决此问题的明显方法。
  • 但是如果我需要使用 cat.x 怎么办?我是否必须采取不同的方法来避免这种情况?还是只要用 g++ 编译就可以了?
  • @Locklan:Clang 是对的,因为它是 UB。 cat.x 尚未初始化。 gcc 只是没有发现问题。
  • 为什么需要使用cat.x,尤其是在它被初始化之前?

标签: c++ gcc clang


【解决方案1】:

一种可能的方法:

class Test {
private:
  explicit Test(Object* ptr)
  : animal{ptr, {ptr, 0}} {}
public:
  Test() : Test(generateObject()) {}
};

【讨论】:

  • 请问显式关键字是做什么的?
  • 它防止单参数构造函数被用作转换构造函数,用于隐式转换。这里不是绝对必要的(因为构造函数是私有的,不太可能被意外使用)。这只是我养成的一种习惯,以至于我不假思索地就这样做了,每当声明一个单参数构造函数时添加explicit(当然,除非我故意想要一个转换的构造函数;然后我会对此添加评论效果)。
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 2011-07-14
  • 2019-09-10
  • 2018-07-29
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多