c++ - 默认模板函数参数
问题描述
参考以下代码:
#include <iostream>
#include <variant>
#include <limits>
using namespace std;
template < bool bitwise = false, typename T>
// template <typename T, bool bitwise = false>
// ^ wont work! error: no matching function for call to 'func<true>(int, int)'
bool func(T a, T b) {
if constexpr(bitwise) {
return a & b;
}
else {
return a && b;
}
}
int main()
{
cout << func(7,1) << endl;
cout << func<true>(7,1) << endl;
}
为什么我必须bitwise
在列表中首先指定参数template
?编译器可以从函数 arg 推导出 T 那么为什么bitwise
在这种情况下需要成为第一个呢?
魔杖盒: https ://wandbox.org/permlink/xtB2jhmNfBh7IoJz
解决方案
这是因为这个电话:
cout << func<true>(7,1) << endl;
这将模板实例true
化为它的第一个(也是唯一的)模板参数。
实例化模板时,任何显式模板参数都分配给模板声明中的初始参数,并且任何剩余参数必须是可推导的。这几乎将给定的模板参数顺序(在模板声明中)作为唯一有效的顺序。
推荐阅读
- mysql - CROSS JOIN和INNER JOIN、LEFT JOIN、RIGHT JOIN、OUTER JOIN的区别
- javascript - 如何在不重新加载页面的情况下显示 django 消息?
- php - 如何从 URL 中删除 /public?
- python - 在设计循环队列中将 queue.front 初始化为 -1 或 0
- wordpress - 使用 Blogger 或 WordPress 对我的网站排名有何影响?
- php - 通过 PHP 使用 imagemagick 向图像添加日期和时间?
- reactjs - React 客户端尝试访问服务器资源而不访问它得到 404
- node.js - 为运行二进制文件的 NPM 脚本设置 CWD
- webgl - 移除 TWGL 中的蓝色方块
- c# - 使用 DbDataReader 读取(迭代)数据时的巨大托管内存分配