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

Use initializer list to create single item vector

我有一个函数 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.)

我发现了可能的重复项 (),但我的问题仍未得到解答:

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

如链接问题重复(原始)中所述,无法强制解决方案以支持采用 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} 如果不附带类型,它确实是模棱两可的。

你不能。

摘录(来自 here,强调我的):

"[...] if the initializer list has a single element of type E and either T is not a reference type or its referenced type is reference-related to E, the object or reference is initialized from that element (by copy-initialization for copy-list-initialization, or by direct-initialization for direct-list-initialization)"

因此,在您的链接示例中,{obj} 将 "decay" 变为 obj,并且重载将解析为 void func(const Obj& a)

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