首页 > 解决方案 > 默认模板函数参数

问题描述

参考以下代码:

#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

标签: c++c++17language-lawyer

解决方案


这是因为这个电话:

cout << func<true>(7,1) << endl;

这将模板实例true化为它的第一个(也是唯一的)模板参数。

实例化模板时,任何显式模板参数都分配给模板声明中的初始参数,并且任何剩余参数必须是可推导的。这几乎将给定的模板参数顺序(在模板声明中)作为唯一有效的顺序。


推荐阅读