使用初始化列表创建单项向量

Posted

技术标签:

【中文标题】使用初始化列表创建单项向量【英文标题】:Use initializer list to create single item vector 【发布时间】:2019-04-16 04:31:34 【问题描述】:

我有一个函数func,它被重载以接受std::vector<Obj> 参数或Obj 参数。

#include <vector>
#include <iostream>

class Obj 
    int a = 6;
;

void func(const std::vector<Obj>& a) 
    std::cout << "here" << std::endl;


void func(const Obj& a) 
    std::cout << "there" << std::endl;


int main() 
    Obj obj, obj2;
    func(obj);
    func(obj, obj2);

实际输出:

there
here

预期输出:

here
here

似乎obj 没有初始化一个向量,而是一个对象。我想在初始化哪种类型时有一些优先顺序。如何精准控制?

(使用 g++ (Ubuntu 8.3.0-6ubuntu1) 8.3.0 编译的示例。)

我发现了一个可能的重复项 (c++11 single element vector initialization in a function call),尽管我的问题仍未得到解答:

我知道obj 可以解析为对象而不是单个元素的向量,并且前者优先。但是有没有办法使用 创建单个项目向量(以便foo 解析为std::vector 重载)?我可以显式创建一个向量,但 似乎更好。

【问题讨论】:

您应该将该问题的所有相关细节添加到这个问题中。 链接中好像间接回答了你的问题:你不能。 【参考方案1】:

正如链接的问题重复(原始)中提到的,没有办法强制解决有利于采用std::initializer_list 的重载。

原始签名(使用int简化):

void func(const std::vector<int> &a); 
void func(const int &a);

因为我遇到过很多次,所以我通常会这样做:

func(std::vector<int>10);

我不知道这样做的任何更短的方法,因为使用实际类型 std::initializer_list 会做同样的事情更加冗长。但从好的方面来说,它至少让你在做的事情变得非常清楚,因为10 如果不伴随类型的话,真的很模棱两可。

【讨论】:

你甚至可以做std::vector10 @HolyBlackCat 是的,但仅从 C++17 开始,带有模板参数推导。【参考方案2】:

你不能。

摘录(来自here,重点是我的):

"[...] 如果初始化列表有一个 E 类型的 single 元素并且 T 不是引用类型,或者它的引用类型是 与 E 相关的引用,对象或引用从 该元素(通过复制初始化进行复制列表初始化,或通过直接初始化进行直接列表初始化)”

因此,在您的链接示例中,obj 将“衰减”为obj,而重载将解析为void func(const Obj&amp; a)

如另一个答案中所述,您可以显式调用func(std::vector obj) 来调用向量重载。

【讨论】:

以上是关于使用初始化列表创建单项向量的主要内容,如果未能解决你的问题,请参考以下文章

在创建指向 Mat 向量的指针时,表达式列表在初始化程序中被视为复合表达式

使用来自控制台的输入来初始化列表的 Seg 错误向量

我可以对带有变量的向量使用 C++11 列表初始化器语法吗?

如何使用大小和值构造函数使用成员初始化器列表初始化用户定义对象的向量

我可以在初始化列表中用 10 个相同的整数初始化 STL 向量吗?

迭代器在添加到添加到列表向量的结构中时会停止指向某个值吗?