大括号封闭初始化列表?转换为矢量

Posted

技术标签:

【中文标题】大括号封闭初始化列表?转换为矢量【英文标题】:Brace Enclosed Initializer List? convert to vector 【发布时间】:2014-12-06 01:51:59 【问题描述】:

所以我有一段代码正在尝试测试。该代码正在检查一些向量(这些是结构的元素)在某些点是否等同于已知向量,但是我遇到了一个问题。当我尝试将向量与已知向量进行如下比较时,

assert((class1.getattr().getattr().getVec(key) == 4,3,2,2))

我收到以下错误:

assertAll.cpp:105:82: error: could not convert ‘4,3,2,2’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<int>’

其余的代码都是正确的,断言的 lval 绝对是一个向量,它应该是。我正在使用 g++ 中的标志 -std=c++11 -Wall -Wextra -pedantic -O 进行编译。有谁知道如何解决这个问题?有没有办法将括号括起来的初始化列表类型转换为向量,或者有更好的方法吗?

【问题讨论】:

您可以编写一个小函数,逐个元素地比较向量,然后返回一个布尔值,可以使用 assert 或使用 std::equal 进行检查。 问题是cpp无法将括号中的信息识别为向量,因此任何使用std::vector的函数都无法处理它。 我们的第一个想法是将它也传递给比较函数,但由于我们无法将第二部分类型转换为向量,显然这也不起作用。 您能发布一个重现错误的简短示例吗? 这可能在语法上是被禁止的。事实上,clang++ 说 "error: initializer list cannot be used on the right hand side of operator '=='" 我找不到用语法摘要生成这个表达式的方法。一些表达式明确允许使用花括号初始化列表,例如订阅(直接)和赋值(通过初始化子句)。 【参考方案1】:

有人知道如何解决这个问题吗?有没有办法将括号括起来的初始化列表类型转换为向量

有趣的是,当我尝试类似的东西时,我在 Clang 3.5 和 GCC 4.9.2 上得到了一个完全不同的错误,但是你可以使用初始化列表语法来构建一个适当的向量(我猜不是完全类型转换):

assert((class1.getattr().getattr().getVec(key) == std::vector<int>4,3,2,2))

我不确定如何在 Coliru 等上运行代码,但以下代码适用于我在 GCC 4.9.2 上使用 g++ -std=c++11 -Wall -pedantic

#include <cassert>
#include <vector>

std::vector<int> foo() 
    return 1,2,3,4;


template<class T>
bool is_equal(const T& a, const T& b) 
    return a == b;


int main()

    assert((foo() == std::vector<int>1,2,3,4));

    assert(is_equal(foo(), 1,2,3,4));

    assert([&](std::vector<int> v) -> bool 
        return foo() == v;
    (1,2,3,4));

当然,没有人会使用这样的 lambda,但正如您从示例中可以看出的那样,您基本上只需要告诉编译器两侧是相同的类型即可获得它将初始化列表转换为向量。

【讨论】:

那个不能解决问题,我也试过了。

以上是关于大括号封闭初始化列表?转换为矢量的主要内容,如果未能解决你的问题,请参考以下文章

无法从大括号括起来的初始化列表转换

大括号初始值设定项列表中是不是允许显式转换运算符?

大括号括起来的初始值设定项列表转换错误

无法从大括号括起来的初始值设定项列表转换

何时使用大括号封闭的初始化程序?

从朋友类继承时无法使用大括号括起来的初始化列表