C++ C++;带括号的非函数typedef
为什么我总是可以在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
#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。不能将类型作为函数参数传递,因此将()
视为构造对象。