我有一个包含QVariant的std :: array的类:
class MyClass()
{
typedef std::array<QVariant, 42> attribs_t;
attribs_t m_Attribs;
public:
MyClass()
{
m_Attribs[0] = 41;
}
};
我现在使用Intel Parallel inspector分析了这个项目,它检测到了
m_Attribs[0] = 41;
我是否必须手动调用std :: array中元素的构造函数,否则这是误报?
答案 0 :(得分:3)
std::array
数组的大小在编译时是固定的,默认构造函数(您的MyClass
构造函数调用它)默认构造或复制构造每QVariant
个阵列。即我希望在构造函数的开头,数组中有42个QVariant
个对象,它们都是无效的(即isValid()
返回false)。
作业应与
具有相同的效果m_Attribs[0] = QVariant( 41 );
对我来说似乎没问题。
简而言之:如果不是因为英特尔的良好声誉,我倾向于声称它是误报。 : - }
答案 1 :(得分:1)
我认为您的代码很好。
示例代码:
#include <iostream>
#include <array>
struct QVariant {
QVariant () : v_(0) { std::cout << "Constructed" << std::endl; }
QVariant & operator=(int x) { std::cout << "Assigned" << std::endl;
v_ = x; return *this; }
int v_;
};
class MyClass {
typedef std::array<QVariant, 5> attribs_t; // 5 instead of 42
attribs_t m_Attribs;
public:
MyClass() {
m_Attribs[0] = 41;
}
};
int main(int argc, const char* argv[]) {
MyClass mc;
return 0;
}
应打印:
Constructed
Constructed
Constructed
Constructed
Constructed
Assigned
并且(在gcc和clang上)