typedef Foo <> Foo编译但是有效吗?

Olu*_*ide 14 c++ templates typedef

以下位代码在VS2008和GCC 4.8.2中编译

template<typename T=void>
struct Foo
{
};

// typedef Foo<> Foo;   // Does *NOT* compile

int main()
{
    typedef Foo<> Foo;
    Foo f1;

   // Foo<char> f2;     // Does *NOT* compile
   //::Foo<char> f3;    // COMPILES
}
Run Code Online (Sandbox Code Playgroud)

有效吗?

Rei*_*ica 17

根据C++ 11 3.3.10/1:

名称可以通过嵌套声明性区域或派生类中的相同名称的显式声明来隐藏.

(强调我的)

这就是为什么模板名称Foo可以通过typedef名称被隐藏Foomain()(不同的范围),但不是在相同的范围内模板名称声明.

至于为什么这个类似案件是合法的:

struct Foo
{
};

typedef Foo Foo;   // *DOES* compile
Run Code Online (Sandbox Code Playgroud)

这是7.1.3/3明确允许的:

在给定的非类作用域中,typedef可以使用说明符重新定义在该作用域中声明的任何类型的名称,以引用它已引用的类型.


Bar*_*rry 11

是的,它是有效的,原因与此有效:

struct Foo { };

namespace bar {
    struct Foo { };
}
Run Code Online (Sandbox Code Playgroud)

你只是在不同的范围覆盖名称.在main中,您仍然可以执行以下操作:

::Foo<int> f2;
Run Code Online (Sandbox Code Playgroud)