C++适当的方式来直列初始化成员变量

问题描述 投票:0回答:2

示例代码:

struct S {
    char data[5];
    int a;
};

当在Microsoft Visual Studio中运行“运行代码分析”时,它警告初始化所有变量。

现在我知道您可以以多种方式执行此操作,创建一个默认的构造函数,例如:

S() : data{0}, a{0} { }
警告消失了。但是,如果您不想手动创建默认构造函数。
thim,例如:

struct S { char data[5]; int a = 0; };

避免了警告
a
的警告,但不能通过这样的添加来解决这一点,尽管您可以通过这样的添加来解决此问题:

data

这似乎使代码分析很高兴。
让我思考,您也可以初始化
{}
我的问题是,这些都是有效的,哪个是首选?
side注意:我注意到
char data[5]{};
有在任何地方都从未初始化的,它也从未在此之后起初,我假设他们只是忽略了此警告吗?还是他们做的事情我没有注意到要“修复”警告?

也想添加此代码:
a

不发出警告, 然而,下面的相同代码给了我:

int a{0};

我看到我可以将其设置为修复它的
std::array
,只是想知道为什么一个编译器会在另一个编译器没有时会发出警告?哪一个是规格?
	

在此方面来自cppcoreguidelines的指南:

不能定义仅初始化数据成员的默认构造函数;改用课堂成员初始化器

因此,您可以做:

_Ty _Elems[_Size];
对于您的另一个问题,关于与
{}

相关的缺乏警告的问题,GCC有一个注释:

  

通常会抑制系统标头的破坏,假设它们通常不会表明实际问题,并且只会使编译器输出更难阅读。

我相信MSVC也是如此。
    

每个声明器的C ++,初始化器可能是以下一个:
c++ class struct initialization member-variables
2个回答
5
投票
#include <new> #include <type_traits> template<class T, std::size_t N> struct static_vector { typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N] = {0}; T& operator[](std::size_t pos) { return *std::launder(reinterpret_cast<T*>(&data[pos])); } }; int main(int argc, char**) { static_vector<int, 10> s; s[0] = argc; return s[0]; }

这些描述如下: 括号中的任意表达式列表和括号内的列表

等于符号,然后是表达式

支撑列表:可能是空的,逗号分隔的表达式列表和其他支撑列表

well实际上是哪种初始化类型的初始化取决于上下文。要使用

gcc9.1 -std=c++17 -Wall
中的类初始化,在类初始化中初始化数据成员,因为在这种情况下,我们不必编写定义的用户,

Compiler生成的一个始终是有效的。

类成员 Non静态数据成员可以使用
子初始化器初始化 list

或使用

默认会员初始器

3
投票

在您的情况下,您可能可以使用:
clang8.0 -std=c++17 -Wall

或给他们不同的值:
  1. warning: suggest braces around initialization of subobject [-Wmissing-braces] typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N] = {0}; ^ {}
  2. 有关更多信息,请参阅
  3. Initialization

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.