在构造函数声明中编写模板类型的参数列表是否有效?

Is it valid to write the template type's parameter list in a constructor declaration?

本文关键字:参数 列表 是否 有效 类型 声明 构造函数      更新时间:2023-10-16

旧的GCC 4.1.2接受以下程序,新的GCC 4.5.1接受以下程序。

但这真的是正确的吗?对于像这样用类型的模板参数声明构造函数,标准有什么规定?

(我发现有趣的是,我不允许在脱行定义中做同样的事情。)

#include <iostream>
template <typename T>
struct Foo {
   Foo<T>(); // <---
};
template <typename T>
Foo<T>::Foo() {
  std::cout << ":)";
}
int main() {
   Foo<int> f;
}

我问这个问题的原因是有人在这个答案的评论中提出GCC可能在这里出错

我将把我最近在圣诞节发出的可能的DR的邮件副本放在这里

下面的代码格式正确吗?

template<typename T>
struct A {
  A<T>();
};

我测试过的几个编译器(clang, g++和comauconline)接受这一点。实际上12.1并没有禁止这样做(A<T>就是它的一个名字)类(不是typedefine -name),但是8.3p1说

声明符id中出现的非限定id应该是一个简单的标识符,除了一些特殊函数的声明(12.3,

构造函数是一个特殊的成员函数,但列表的交叉参考文献不包括12.1。这是否意味着上面的代码不合语法的吗?或者这是一个偶然的遗漏?

如果在行外定义中做相同的操作,则将尝试将模板参数传递给构造函数。这是有效代码

struct A {
  template<typename T> A();
};
template<> A::A<int>() { }

规范说,当注入的类名在类的作用域中使用时(就像在A::A中一样),那么当名称查找接受函数/构造函数名时,注入的类名引用将被翻译为解析为该类的构造函数(如果名称查找上下文只接受类型,则名称仍将是注入的类名,并表示类类型)。在A::A之后,名称查找完成并生成构造函数。然后<int>只能被解析为模板参数列表。如果你的构造函数中没有模板,你的代码将是无效的。