当前位置: 首页 > 知识库问答 >
问题:

为什么我不能初始化向量从std::initializer_list如果foo有一个非显式构造函数从字符串?

拓拔霄
2023-03-14

在MS Visual Studio 2013中使用C 11,我有一个类testNetInfo,它有一个来自std::字符串的非显式构造函数,我想从std::初始化器字符串列表构造这些向量。

如果我从initializer_list构造一个临时向量,我可以用它来设置真正的向量:

void SimComparisonTests::compareCombinationalGateWithXorZ(const std::string& outNetName, std::initializer_list<std::string> initList) {

std::vector<std::string> inNetNames(initList);
std::vector<testNetInfo> netInfo;
for (auto nn = inNetNames.begin(); nn != inNetNames.end(); ++nn) {
    netInfo.push_back(testNetInfo(*nn));
}

但尝试直接从initList创建netInfo时,如下所示:

std::向量

给出以下错误:

  • 错误C2664:'std::向量

如果我将initList的类型更改为initializer\u list,似乎可以避免此错误

compareCombinationalGateWithXorZ("triOut3", {"triIn3", "triEn3"});

但该修复程序可能遇到的一个问题是,从字符串(或const char*)到testNetInfo对象的转换必须在运行时分配testNetInfo中的类静态指针后完成,该指针用于进行名称查找以初始化对象的其余部分。这将在调用上述函数时完成,并且上述初始化在我的实现中看起来正常,但我是否会通过声明initializer\u列表来推动未定义的行为


共有1个答案

叶富
2023-03-14

仅仅因为A可转换为B并不意味着initializer_list

至于修复,只需使用范围构造函数。

std::vector<testNetInfo> netInfo(initList.begin(), initList.end());

 类似资料:
  • 以下节目 使用当前Clang(12.0.0)编译,但不使用当前GCC(11.0.0 20201028)。使用GCC它会产生错误 根据[dcl.init.list/5]和string_view(char const*)构造函数是constepr这一事实,我假设Clang的行为就在这里。 对吗?

  • 考虑一个大型内存容器。在这个简单的例子中 span允许我在内存上创建一个轻量级视图。现在,我只想打印跨度: 输出: 现在我想制作子集(这是实际上作为视图变得有用的地方)。我可以使用迭代器来指定我的范围并从调用这个构造函数(3) 但这行不通: C没有与参数列表匹配的构造函数实例参数类型为:(std::\u Vector\u iterator 有可能使用接受指针和大小的构造函数(2): 但这违背了迭代

  • 问题内容: 为什么我们必须在Servlets中重写init()方法,同时可以在构造函数中进行初始化,并让Web容器调用构造函数,同时在调用构造函数时将ServletConfig引用传递给Servlet? 当然,容器必须为此使用反射,但是容器仍然必须使用反射来调用简单的无参数构造函数 问题答案: 由于构造函数不能是接口的一部分,因此与常规方法不同,不能在Servlet API中“正式”指定构造函数。

  • 我遇到了一个有趣的问题,我不明白发生了什么: 据我所知,我提供的单个整数参数可以解释为使用参数调用构造函数,也可以解释为使用初始化列表的构造函数。似乎只有当我提供左值时才调用initialiser_list构造函数,但当我提供r-value(至少是文字)时,构造函数。为什么会这样? 这也意味着: 结果仅为大小为1的向量; 结果是一个大小为num\u元素的向量,但我认为应该避免这种初始化,因为偶尔会

  • 显式复制构造函数不允许类似于的东西,并将复制使用强制为。此外,显式复制构造函数也不允许从函数中按值返回对象。然而,我尝试用大括号替换复制初始化,就像这样 我得到的错误(g 5.2) 错误:没有匹配的函数用于调用'Foo::Foo(Foo 或(叮当声) 错误:结构初始值设定项中的元素过多 删除使代码在g下可编译,但clang仍然会失败,并出现相同的错误(感谢@stophen)。这是怎么回事?统一初始

  • 问题内容: 在Java中,以以下方式初始化String数组是完全合法的: 但是,当尝试实例化以String数组作为参数的类时,不允许以下代码: 但这再次起作用: 有人可以解释为什么吗? 问题答案: String[] s = {“FOO”, “BAR”}; 仅在声明时允许 你不能