使用初始化列表创建单项向量
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})
来调用向量重载。
我有一个函数 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})
来调用向量重载。