【发布时间】:2021-10-22 20:45:27
【问题描述】:
最近,我决定编写一个类来存储带有 reference_wrapperstd::variant<vector<string>, reference_wrapper<const vector<string>>>。
有趣的部分是变体根据初始化存储的内容。
我做了一个小的investigation,结果证明,在所有情况下vector<string> 类型都获胜,除了通过std::cref 传递的情况。这同样适用于函数(有点意料之中,因为构造函数在这方面类似于函数)
void f(vector<string>); // #1
void f(reference_wrapper<const vector<string>>); // #2
vector<string> data;
const vector<string>& get_data();
f(data); // #1
f(std::cref(data)) // #2
f(get_data()); // #1
f(std::cref(get_data())) // #2
问题是为什么vector<string> 在这里有优先权。我查看了 最佳可行功能 部分 here ,但没有多大意义。看来,
4) or, if not that, F1 is a non-template function while F2 is a template specialization
部分选择vector<string> 而不是reference_wrapper<vector<string>>(因为reference_wrapper 构造函数是模板化的),但我不确定,因为使用规则我无法完全理解它们是否相等
1) There is at least one argument of F1 whose implicit conversion is better than the corresponding implicit conversion for that argument of F2
有人可以描述每种情况下应用的所有隐式转换,并说明一个重载优于另一个重载的真正原因吗?对我来说,它们如下:
f(data) = f(vector<string>&) -> (*exact match* implicit conversion) -> f(vector<string>)
f(data) = f(vector<string>&) -> (*conversion* implicit conversion) -> f(reference_wrapper<vector<string>>)
我错过了什么吗?
另一个问题,与该主题相关:隐式转换序列的排名部分again,here 留下一个问题,T(const T&) 是否被视为完全匹配(用户定义类类型转换为同一类)或转换?
【问题讨论】:
标签: c++ overload-resolution reference-wrapper