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

时间:2015-01-15 09:19:10

标签: 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,aaaa()); 
}

此功能的输出是

  

函数1被称为

我想知道当一个参数是一个类型时它意味着什么?为什么我应该给函数aaaa()和aaaa没有括号会给编译器错误?

error: expected primary-expression before ‘)’ token
  function1(1,aaaa); 
                  ^

2 个答案:

答案 0 :(得分:3)

T();其中T是任何类型,都会创建类型为T的无名临时文件。创建的对象为value initialized。应用aaaa typedefint时,会创建一个临时int,并为其分配值0

答案 1 :(得分:3)

function1(1, aaaa)相当于function1(1, int) - 你试图将一个类型作为参数传递,这是一个错误的形式。

function1(1,aaaa()) aaaa()中创建一个值int的临时0。参见例如C ++ 14 draft N4140 [expr.type.conv] / 2:

  

表达式T(),其中T简单类型说明符 typename-specifier ,用于非数组完整对象类型或者(可能是cv-qualified)void类型,创建一个指定类型的prvalue,其值是由值初始化(8.5)类型为T的对象生成的;