C++ 将带括号的typedef作为参数传递

C++ 将带括号的typedef作为参数传递,c++,templates,c++11,types,typedef,C++,Templates,C++11,Types,Typedef,我发现了一段带有奇怪参数的代码,它是一种类型: #include <iostream> using namespace std; template<class T> int function1(T count,double) { cout<<"function1 is called"<<endl; return 1111; } int main() { typedef int aaaa; function1(1,

我发现了一段带有奇怪参数的代码,它是一种类型:

#include <iostream>
using namespace std;

template<class T>
int function1(T count,double)
{
    cout<<"function1 is called"<<endl;
    return 1111;
}

int main()
{
    typedef int aaaa;
    function1(1,aaaa()); 
}
T;其中T是任意类型,创建T类型的无名临时对象。创建的对象为。当应用于aaaa时,它是int的typedef,将创建一个临时int,并将其赋值为0。

T;其中T是任意类型,创建T类型的无名临时对象。创建的对象为。应用于aaaa(int的typedef)时,将创建一个临时int,并将其赋值为0。

function11,aaaa相当于function11,int-您试图将类型作为参数传递,该参数格式不正确

在函数11中,aaaa创建一个值为0的临时int。参见示例C++14草案N4140[expr.type.conv]/2:

表达式T,其中T是非数组完整对象类型或可能的cv限定void类型的简单类型说明符或typename说明符,创建指定类型的prvalue,其值是初始化类型为T的对象的值8.5所产生的值

function11,aaaa相当于function11,int-您试图将类型作为参数传递,这是格式错误的

在函数11中,aaaa创建一个值为0的临时int。参见示例C++14草案N4140[expr.type.conv]/2:

表达式T,其中T是非数组完整对象类型或可能的cv限定void类型的简单类型说明符或typename说明符,创建指定类型的prvalue,其值是初始化类型为T的对象的值8.5所产生的值


它创建了该类型的临时对象。它创建了该类型的临时对象。创建一个永远不会使用的临时值有什么好处?@Gordon为什么永远不会使用它?你把它传递给一个函数。如果问题是,写aaaa而不是0有什么好处?在aaaa是模板参数的模板代码中,它可能很有用,因此您现在不需要预先输入它的类型。不,我的问题是,从函数视图来看,为什么函数需要接收未使用的变量。这个函数对double类型有什么作用?我猜它是用于函数重载的。@Gordon这是一个未使用的参数,它不必有名称。它出现的原因可能是历史性的——它可能曾经被使用过。它也可能是一个虚拟函数的实现,或者一些回调。创建一个永远不会使用的临时值有什么好处?@Gordon为什么永远不会使用它?你把它传递给一个函数。如果问题是,写aaaa而不是0有什么好处?在aaaa是模板参数的模板代码中,它可能很有用,因此您现在不需要预先输入它的类型。不,我的问题是,从函数视图来看,为什么函数需要接收未使用的变量。这个函数对double类型有什么作用?我猜它是用于函数重载的。@Gordon这是一个未使用的参数,它不必有名称。它出现的原因可能是历史性的——它可能曾经被使用过。它也可能是一个虚拟函数的实现,或者是一些回调函数。
error: expected primary-expression before ‘)’ token
  function1(1,aaaa); 
                  ^