为什么typedef模板是非法的?
从实际的角度来看,我明白typedef
和test
都有些“多余”,如果我们想要编译下面的代码,需要将其删除:
template< typename type_t >
typedef struct tagTest
{
int a;
} test;
但是,我认为typedef声明集是声明集的一个子集。 他们碰巧有那个特定的decl-specifier。 那是我的理性化
typedef struct tagTest
{
int a;
} test;
引入标识符test
并声明结构tagTest
。 如果这种解释是正确的,那么标准中的以下段落应该允许template
typedef
(尽管不是关键字using
给出的含义)。
模板声明中的声明应 - (1.1)声明或定义一个函数,一个类或一个变量,或 - (1.2)定义一个成员函数,成员类,成员枚举或静态数据成员类模板或嵌套在类模板中的类,或 - (1.3)定义类或类模板的成员模板,或者 - (1.4)是别名声明。
我在推理中看不到错误,但结论是非法的。
解决上述难题的标准有哪些相关部分?
更新部分上述推理使用了typedef
struct
声明结构的事实。 就我所知, typedef
说明符暗示所有声明的变量都是类型。 也就是说, typedef
升级会从单纯的变量test
为与声明的tagTest
等效的类型。 这就是为什么下面的代码编译(虽然有警告)。
typedef struct tagTest
{
int a;
};
tagTest t;
其中一个答案照顾了多余的test
。 但是,可以在没有声明的情况下使用typedef,因为“在声明命名类/结构/联合或命名枚举时,Init-declarator-list是可选的”
在C ++ 11之前不允许使用模板类型定义,并且引入了C ++ 11模板别名来解决这些问题。 (CFR)。 C ++模板typedefs和维基百科。
正如你所指出的那样,因为标准不允许typedef
在那里,所以代码是无效的
别名声明:
using identifier attribute-specifier-seqopt= type-id ;
typedef
声明不是别名声明。
此外,如果您声明了一个类模板,则不能拥有一个声明器,但是该标准明确禁止它
[温度] / P3
在模板声明,显式专门化或显式实例化的情况下,声明中的init-declarator-list最多只能包含一个声明器。 当使用这样的声明来声明类模板时,不允许声明器 。
所以甚至不会编译以下内容
template< typename type_t >
struct tagTest
{
int a;
} test;
编辑:
这是没有说明的
typedef struct S { };
应该是一个错误,因此gcc和clang都会接受警告。 我假设Clang指望[temp] / 3在typedef与模板一起使用的情况下发出错误,而gcc立即拒绝此代码
template<typename T>
typedef struct S { };
(CFR)。 铿锵虫22249
C不支持模板和
typedef struct tagX {
} X;
在C ++语法是退化C,那里允许继续支持C头等,而不是在实际的C ++中使用。
上述的C ++语法是
struct X {};
(支架放置时的YMMV)
与typedef
定义的内容无关,这是一个typedef
声明,在这些情况下未列出:
而要明确typedef
声明不是别名声明。 标准§7中的语法指定的别名声明是:
别名声明:
using identifier attribute-specifier-seqopt= type-id ;
更何况,如果这是可能的话,那么using
声明的模板就不会像现在这样“酷”,并且两者都没有意义。
上一篇: Why are typedef templates illegal?
下一篇: How to declare a function return a pointer to function return pointer to int[3]