C++ C++;带括号的非函数typedef

C++ C++;带括号的非函数typedef,c++,function,typedef,C++,Function,Typedef,为什么我总是可以在typedef中添加一对括号,这是什么意思 #include <iostream> #include <typeinfo> int main() { typedef int td; std::cout << typeid(td).name() << std::endl; std::cout << typeid(td()).name() << std::endl; retur

为什么我总是可以在typedef中添加一对括号,这是什么意思

#include <iostream>
#include <typeinfo>

int main() {
    typedef int td;
    std::cout << typeid(td).name() << std::endl;
    std::cout << typeid(td()).name() << std::endl;
    return 0;
}
td()
int()
:返回不带参数的
int
函数。

td()
int()
:返回不带参数的
int
函数。

td()
根据语法可以是两件事之一:

  • 它可以是一个类型id,将类型命名为“不带参数并返回
    td
    ”的函数
  • 它可以是一个表达式,表示初始化的值
    td
typeid
运算符可与类型id和表达式一起使用。该歧义由标准解决,有利于将其作为类型id(§8.2[dcl.ambig.res]/p2):

由于函数样式之间的相似性而产生的歧义 类型转换和类型id可以在不同的上下文中出现。歧义 显示为函数样式强制转换表达式和 类型的声明。解决方案是任何可以 在其语法上下文中可能是类型id应被视为 类型id

在不允许类型id的上下文中,
td()
将是初始化的
td
对象的值。例如:

void foo(int i = int()); 
相当于

void foo(int i = 0); 
td()
根据语法可以是以下两种情况之一:

  • 它可以是一个类型id,将类型命名为“不带参数并返回
    td
    ”的函数
  • 它可以是一个表达式,表示初始化的值
    td
typeid
运算符可与类型id和表达式一起使用。该歧义由标准解决,有利于将其作为类型id(§8.2[dcl.ambig.res]/p2):

由于函数样式之间的相似性而产生的歧义 类型转换和类型id可以在不同的上下文中出现。歧义 显示为函数样式强制转换表达式和 类型的声明。解决方案是任何可以 在其语法上下文中可能是类型id应被视为 类型id

在不允许类型id的上下文中,
td()
将是初始化的
td
对象的值。例如:

void foo(int i = int()); 
相当于

void foo(int i = 0); 

值得注意的是,这里实际上有一个歧义,标准解决了这一问题,支持将
int()
作为一个类型,而不是一个初始化值
int
@T.C。那么返回值是一个类型,而不是默认构造的int?或者这取决于它是右值还是左值?在模板中,我有时会看到T(),然后似乎可以用它初始化向量中的空槽……值得注意的是,这里实际上存在一个歧义,标准解决了这个歧义,支持
int()
是一种类型,而不是初始化的值
int
@T.C.那么返回值是一种类型而不是默认构造的int?或者这取决于它是右值还是左值?在模板中,我有时会看到T(),然后似乎可以用它初始化向量中的空槽…所以在上面。。。是td()或td()的返回值,被视为具有类型5的“函数对象”?如果是前者,看起来很奇怪,它的值与td产生的值(i)@fast reflections在
typeid(td())
中不同,
td()
被视为一个类型。这就好像您声明了
intfoo()typeid(foo)
。。。有些函数重载了指示其使用类型的参数(例如alg function at),我假设我们不能向函数提供类型(作为参数),因此我们(在该示例中)在类型之后使用(),而不是仅提供类型,以便在本例中,结构,将被默认构造,并且参数实际上将是这种类型的对象,而不仅仅是正确的一般类型(不起作用)?@fast reflections right。您不能将类型作为函数参数传递,因此将
()
视为构造对象。。。是td()或td()的返回值,被视为具有类型5的“函数对象”?如果是前者,看起来很奇怪,它的值与td产生的值(i)@fast reflections在
typeid(td())
中不同,
td()
被视为一个类型。这就好像您声明了
intfoo()typeid(foo)
。。。有些函数重载了指示其使用类型的参数(例如alg function at),我假设我们不能向函数提供类型(作为参数),因此我们(在该示例中)在类型之后使用(),而不是仅提供类型,以便在本例中,结构,将被默认构造,并且参数实际上将是这种类型的对象,而不仅仅是正确的一般类型(不起作用)?@fast reflections right。不能将类型作为函数参数传递,因此将
()
视为构造对象。