【发布时间】:2018-05-01 21:43:42
【问题描述】:
这个问题与数组初始化和 SystemC 模块层次结构有关。
我有一个不可复制、不可移动且没有默认构造函数的类:
class Object : public sc_module {
public:
Object(string name, Configuration config);
Object(const CPU& that) = delete;
};
以及另一个具有这些数组的类:
class Object2 : public sc_module {
public:
std::array<Object, 2> obj_array;
Object2() : obj_array <--??-->
{}
};
我需要用Objects初始化obj_array,不能复制也不能移动。
我已经尝试了一大堆组合,编译的一件事是:
class Object2: {
public:
std::array<Object, 2> obj_array;
//note the double braces on this initializer list
Object2() : obj_array {{ {"string1", config}, {"string2", config} }}
{}
};
它可以工作,但我稍后在代码中看到了一些奇怪的行为:当我在obj_array 中打印出Objects 的名称时,第一个是正确的Object2.string1,但下一个真的很奇怪@ 987654329@ 应该只是 Object2.string2)。
我知道很多人都问过非常相似的问题,但我想弄清楚这里到底发生了什么。在我看来,初始化器列表中的花括号太多了,但否则无法编译。
我正在使用带有标志 -std=c++14 的 g++ 6.4.0
问题是如果我在构造函数的主体中创建另一个数组,例如 类对象2:{ 民众: std::array obj_array; //注意这个初始化列表中的双括号 Object2() : obj_array {{ {"string1", config}, {"string2", config} }} { 对象 arr[2] {{"test", config}, {"test2", config}}; } };
一切正常。 arr 对象名称正确,其父对象名称也正确。
我知道这是一个深奥的问题,但我需要帮助了解在我的 obj_array 初始化期间到底发生了什么机制。
【问题讨论】:
-
所以你说成员
std::array不起作用,而普通的本地数组确实起作用。那么有一个明显的问题:你尝试过普通的成员数组吗? -
您宁愿将构造函数名称从
CPU更改为Object。 -
你检查了构造函数的实现,甚至是打印函数吗?可能有例如一些静态变量,它持有一些状态,它会导致这种奇怪的行为。
-
@NuPagadi 更新了构造函数名称(我的错误)。在 Object 的构造函数中,第一个参数是正确的(sc_module 的名称)。我越来越认为这是 SystemC 在如何确定模块的父级方面的奇怪之处。
-
尝试在大括号内使用
string{"string1"}。喜欢obj_array {{ {string{"string1"}, config}, {string{"string2"}, config} }}
标签: c++ initializer-list systemc