函数参数中不允许使用 C++ 模板占位符

Arj*_*ais 5 c++ templates arguments placeholder parameter-passing

在以下 C++ 代码中, function 的参数fun1和 function 的返回类型中的模板占位符ret1无法编译:

template <typename T = int>
class type {
    T data;
};

void fun1(type      arg); // Error: template placeholder not permitted in this context 
void fun2(type<>    arg); // Ok
void fun3(type<int> arg); // Ok

type      ret1(); // Error: Deduced class type 'type' in function return type
type<>    ret2(); // Ok
type<int> ret3(); // Ok

int main() {
    type      var1;  // Ok!!!!!!
    type<>    var2;  // Ok
    type<int> var3;  // Ok
}
Run Code Online (Sandbox Code Playgroud)

不过,var1还好啦。

  • 为什么可以var1编译,但是fun1ret1编译?
  • 函数声明和变量声明之间的这种不一致行为背后是否存在任何逻辑?

bit*_*ask 5

var1受益于CTAD,其中所有非默认模板参数(即无)都可以从初始化中推断出来。然而,这两个函数声明都不是 CTAD 的候选者,因此即使该列表为空,也必须提供模板参数列表。

类模板的扣除

隐式生成的演绎指南

当在函数风格的转换或变量的声明中,类型说明符仅由主类模板 C 的名称组成(即,没有伴随的模板参数列表)时,推导的候选者形成如下:
.. 。

(强调已添加)