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

时间:2019-04-16 04:31:34

标签: c++ initializer-list

我有一个函数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重载)?我可以显式创建矢量,但是{}看起来更好。

2 个答案:

答案 0 :(得分:5)

如链接的问题副本(原始文档)中所述,没有办法强制解决方案以采用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}如果不附带类型,则确实是模棱两可的。

答案 1 :(得分:3)

你不能。

节选(摘自here,重点是我的):

  

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

因此,在您的链接示例中,{obj}将“衰减”到obj,过载将解决为void func(const Obj& a)

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