gpt4 book ai didi

c++ - typedef Foo<> Foo 编译但它有效吗?

转载 作者:IT老高 更新时间:2023-10-28 22:34:18 26 4
gpt4 key购买 nike

以下代码在 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
}

有效吗?

最佳答案

按照 C++11 3.3.10/1:

A name can be hidden by an explicit declaration of that same name in a nested declarative region or derived class.

(强调我的)

这就是为什么模板名称 Foo 可以被 main() 内的 typedef 名称 Foo 隐藏(不同的范围),但不能在与声明模板名称相同的范围内。

至于为什么这种类似的情况是合法的:

struct Foo
{
};

typedef Foo Foo; // *DOES* compile

这是 7.1.3/3 明确允许的:

In a given non-class scope, a typedef specifier can be used to redefine the name of any type declared in that scope to refer to the type to which it already refers.

关于c++ - typedef Foo<> Foo 编译但它有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com