发现一个c++函数参数没有参数名的骚操作，来历是什么？
最近开始学习模板编程，在看boost库时发现某个模板函数的声明时发现：

    
    
    template <typename ExecutionContext,
        BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken
          BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
            typename ExecutionContext::executor_type)>
    BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(NullaryToken, void()) post(
        ExecutionContext& ctx,
        BOOST_ASIO_MOVE_ARG(NullaryToken) token
          BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(
            typename ExecutionContext::executor_type),
    // 注意看下面两行
        typename constraint<is_convertible<
          ExecutionContext&, execution_context&>::value>::type = 0);

typename constraint<is_convertible<ExecutionContext&,
execution_context&>::value>::type显然是一个类型（实际是int），意思是这里相当于写了 int=0
（当时看到这里很惊讶居然还能这样写）， **猜测是用于推导模板参数是否符合生成模板函数的要求。**

于是自己写了如下代码测试

    
    
    #include <iostream>
    
    inline auto func(int a, int = 2) { std::cout << a << std::endl; }
    
    int main() {
      func(4);// print 4
      return 0;
    }

无警告编译通过并成功运行。

疑惑点如下：

这个特性的具体名字叫什么？测试了在c++98就支持了，而貌似c语言不支持这种写法。  
特性的用法是否和我猜测的一致？是否有更多的其他用法？
C++的函数分为声明与实现两个部分。

声明的地方本来就是不需要写参数名的，只有实现部分需要写，这不是什么骚操作。

至于实现部分如果不需要使用这个参数，也可以不写，参数名只是用来访问这个参数的入口。

至于为什么有可能在实现部分不写参数名？

多人协作开发的情况下，这很正常啊。

你的模块先定接口，再写代码。

而接口是需要保持相对稳定的，所以接口参数一般会有一定程度的预留。

其中部分的接口参数完全可能是现在代码还没有用到的参数（你本来就是为了预留将来修改用的。）

这个参数如果你单纯的不使用，编译器会给你的代码给出警告。

那么，如何去掉这个警告呢？把参数名称去掉，只留参数类型，这样的话编译器就没有警告了。

于是，就有了无参数名称函数的情况。