在参数列表中声明一个不完整的类型模板参数

Cpp*_*oob 5 c++ templates declaration language-lawyer

我见过用过:

boost::error_info<struct tag_name, std::string> name_info;
Run Code Online (Sandbox Code Playgroud)

这里tag_name命名一个不完整的类型,struct它之前的关键字似乎就地声明它,而不是稍微冗长:

struct tag_name;
boost::error_info<tag_name, std::string> name_info;
Run Code Online (Sandbox Code Playgroud)

允许这个标准的相关部分是什么?

Col*_*mbo 6

§3.4.4/ 2规定了在任何情况下如何查找详细类型说明符以及它们可能具有的效果:

如果class-key引入了elaborated-type-specifier,并且这个查找没有找到先前声明的type-name [..],则 elaborated-type-specifier是一个声明,它引入了3.3中描述的 类名. 2.

然后§3.3.2/ 7(.2)读

一类声明的点首先声明在阐述型说明符如下所示:[..]用于阐述型说明符的形式的

         类密钥标识符

如果在命名空间作用域中定义的函数的decl-specifier-seq或 parameter-declaration-clause中使用了elaborated-type-specifier,则在包含声明的命名空间中将标识符声明为类名.否则,除了作为声明之外,标识符在包含声明的最小名称空间或块作用域中声明.friend