2014-10-09 77 views
1

为什么我总是可以在typedef中添加一对括号,它是什么意思?带括号的C++无功能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; 
} 

输出:

i 
FivE 

回答

3

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

  • 它可以是一个型-ID,命名类型“功能采取任何参数和返回td
  • 它可以是表达式,意思是值初始化的td

typeid操作者可以既具有型-ID表达使用。这种模糊性是通过在有利于它是一个型-ID(第8.2节[dcl.ambig.res]/P2)的标准解决:

的函数式 之间从相似引起的模糊并且type-id可以出现在不同的上下文中。模糊性 显示为函数式演员表达式和类型声明之间的选择。该决议是,任何可能在其语法上可能为类型的构造应被认为是 type-id

在上下文其中型-ID是不允许的,td()将是一个值初始化td对象。例如:

void foo(int i = int()); 

相当于

void foo(int i = 0); 
+0

所以在上面...它是td()或td()的返回值,看到作为具有FivE类型的“函数对象”?如果前者看起来很奇怪,它与'typeid(td())'中的td yield(i) – 2014-10-09 16:01:20

+0

@ fast-reflex不完全相同,则将'td()'作为类型。就好像你声明了'int foo();'然后'typeid(foo)'。 – 2014-10-09 16:06:00

+0

只是为了清晰的事情...一些函数重载了参数,指出它们用于何种类型(例如http://en.cppreference中的alg函数。com/w/cpp/iterator/iterator_tags),我假设我们不能为函数提供一个类型(作为一个参数),我们改为(在这个例子中)在类型之后使用(),而不是仅仅提供类型在这种情况下,该结构将被默认构造,并且该参数实际上是该类型的对象,而不仅仅是一种通用类型(不起作用),该类型正确吗? – 2014-10-09 16:19:09

4

td()int():返回int采取任何参数的函数。

+1

值得一提的是,居然有一个模棱两可的标准有利于为int'解析()'是一个类型,而不是一个值初始化'INT '。 – 2014-10-09 15:43:14

+0

@ T.C。所以返回值是一个类型而不是默认构造的int?或者这取决于是右值还是左值?在模板中,我有时会看到T(),然后似乎有可能使用它初始化向量中的空槽... – 2014-10-09 15:45:28