c++圆括号重载 连续两个圆括号是什么写法

看代码的时候看到一种写法

template<typename A, typename D>
class A
{
...
  void test(void* ptr = nullptr) {
    if (mptr) {
        A()(&ptr, size);
        D()(mptr);
      }
  }
 ...
private:
  void * mptr;
};

struct test1 {
  void operator()(void** ptr, size_t size) { ... };
} 

struct test2 {
  void operator()(void* ptr) { ... };
} 
using test3 = test

int main()
{
  ...
}

请问D()(mptr)这个是什么写法 而为什么我改成D(mptr)编译可以通过,但A()(&ptr, size)改成A(&ptr, size)就可以通过?