我有一个函数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函数调用中的单元素向量初始化 https://stackoverflow.com/questions/46565165/c11-single-element-vector-initialization-in-a-function-call),尽管我的问题仍未得到解答:
我明白那个{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}
如果不附上类型的话真的很暧昧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)