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