用模板参数的模板来解决不明确调用的c++默认行为是什么
What is c++ default behavior to resolve ambiguous calls with template of template parameter?
考虑以下代码:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void f(T& a) {
cout << "a" << endl;
}
template <typename T>
void f(vector<T>& a) {
cout << "b" << endl;
}
int main(int argc, char** argv) {
vector<vector<int>> v;
f<vector<vector<int>>>(v);
f<vector<int>>(v);
f(v);
}
在对f的前两次调用中,我明确指定了要使用的模板版本,因此我可以控制要调用的函数版本。
第三个隐式调用应该是不明确的,因为正如前两个调用所显示的那样,我们可以选择。令人惊讶的是,g++编译器并没有侮辱我,而且毫无怨言地完成了它的工作。
输出为
a
b
b
这意味着CCD_ 1已经用于第三次呼叫。
那么,这种情况下的默认行为是什么呢?我的理论是,它采取了最严格的例子,这在这种情况下是有意义的。这是真的吗?这是在某个地方指定的吗,因为我不能相信随机性。
这里向量类没有什么特别之处。我实际上实现了一些图算法,但由于我可能对图有不同的表示,例如作为邻接列表向量<向量<支出<weighttype>gt>或者作为弧列表向量<arc<weighttype>gt,以及弧的不同表示,这取决于它是否是未加权/加权图/流网络,它可以携带不同类型的信息。我正在尝试使用模板编写通用代码,但目前我正面临这种问题。
感谢
据说您的第二个f
比您的第一个f
更专业,因此当两者匹配时,第二个f
赢得过载解决方案。
标准中详细地给出了更专业化的确切定义,但其基本思想是弄清楚对其中一个的任何调用是否总能与另一个相匹配(但反之亦然(。也就是说,如果第二个f
有一个std::vector<X>&
,那么它也可以与第一个f
的T&
相匹配。但是,如果第一个f<vector<int>>
0有一个通用的X&
,就不能保证它会与第二个f
的std::vector<T>&
相匹配。
相关文章:
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 默认的target_link_libraries隐私设置是什么
- 始终声明默认构造函数的优缺点是什么?
- 如果默认构造函数不执行任何操作,则目的是什么
- lambda 的默认捕获是什么?
- 安卓中使用的默认C++版本是什么
- 存储具有许多变体的类的默认值的推荐方法是什么?
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 初始化构造函数的默认参数的优选方法是什么?
- C++11 中的默认正则表达式引擎是什么?
- 默认模板参数的范围是什么?
- R 值引用参数的正确默认值是什么?
- 在显式实例化向量时<someType>,someType 默认构造函数的用途是什么?
- 标准全局默认运算符新的对齐限制是什么?
- NetBeans使用的默认make工具是什么
- 当C/C++程序切换语句转到未定义的大小写并且缺少默认值时,它的正确行为是什么:
- enum变量的默认值是什么
- 默认参数模板与可变参数模板:最后一个模板参数是什么
- 对于默认定义的移动构造函数,noexcept的规则是什么