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

qwe*_*iop 4 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});
}
Run Code Online (Sandbox Code Playgroud)

实际输出:

there
here
Run Code Online (Sandbox Code Playgroud)

预期产量:

here
here
Run Code Online (Sandbox Code Playgroud)

似乎{obj}不是初始化向量,而是初始化一个对象。我猜要初始化的类型有一些优先顺序。如何精确控制?

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

我发现了一个可能的重复项(函数调用中的c ++ 11单元素矢量初始化),尽管我的问题仍然没有得到回答:

我知道{obj}可以解析为对象,而不是单个元素的向量,并且前者优先。但是,有没有一种方法可以{}用来创建单个项目向量(从而foo解决std::vector重载问题)?我可以显式创建向量,但{}看起来更好。

Res*_*ion 5

如链接的问题副本(原始文档)中所述,无法强制解决方案以支持重载std::initializer_list

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

void func(const std::vector<int> &a); 
void func(const int &a);
Run Code Online (Sandbox Code Playgroud)

由于我已经遇到过很多次,所以我通常这样做:

func(std::vector<int>{10});
Run Code Online (Sandbox Code Playgroud)

我不知道执行此操作的任何更短方法,因为使用std::initializer_list将执行相同操作的实际类型更加冗长。但是从最大的角度来说,这至少使您所做的事情非常清晰,因为{10}如果不附带该类型,这确实是模棱两可的。