C++ 标准对未实例化模板的要求
C++ standard requirements to templates that are not instantiated
所以我尝试编译下面的代码但失败了(正如预期的那样):
1.cpp: In function ‘int foo()’:
1.cpp:3:5: error: ‘some’ was not declared in this scope
some ill-formed code
^
但是如果我删除这一行编译器编译它没有任何错误(也是预期的,因为不知道 T
类型是否有 random_name()
方法)。
似乎未使用(未实例化)模板的诊断在某种程度上是实现定义的。但也许标准对这种情况有一些要求。比如编译下面的代码不报错是否符合标准?
我试图在网站上搜索答案,但找不到任何相关问题。
template <class T>
int foo() {
some ill-formed code
return T::random_name();
}
template <>
int foo<int>() { return 0; }
int main() {
return foo<int>();
}
这是实施质量问题,格式不正确,但如果未实例化,则不需要根据 [temp.res#8.1]p:
进行诊断
The validity of a template may be checked prior to any instantiation.
[ Note: Knowing which names are type names allows the syntax of every template to be checked in this way.
— end note
]
The program is ill-formed, no diagnostic required, if:
- no valid specialization can be generated for a template or a substatement of a constexpr if statement within a template and the template is not instantiated, or
我们可以使用 -fdelayed-template-parsing
.
查看 from this live godbolt example MSVC does not diagnose this case. This is because MSVC is not using two-phase lookup but using /permissive-
changes this. clang even has an MSVC compatibility mode to emulate this
我们可以看到 from this live godbolt using these two options clang 不再生成诊断信息,但 MSVC 可以。
函数 template
中的名称是 相关的 ,即实体以某种形式依赖于 template
参数,或者它们是 independent,即没有迹象表明它依赖于 template
参数。定义函数 template
时查找独立名称。在 template
实例化期间查找依赖名称,即在定义函数 template
时不需要定义名称。未能查找名称是一个错误。这个过程的细节有点复杂,并且在 template
s.
的章节中占据了大部分内容
在您的例子中,some
是一个独立名称,而 T::
资格使 random_name
成为从属名称。
所以我尝试编译下面的代码但失败了(正如预期的那样):
1.cpp: In function ‘int foo()’:
1.cpp:3:5: error: ‘some’ was not declared in this scope
some ill-formed code
^
但是如果我删除这一行编译器编译它没有任何错误(也是预期的,因为不知道 T
类型是否有 random_name()
方法)。
似乎未使用(未实例化)模板的诊断在某种程度上是实现定义的。但也许标准对这种情况有一些要求。比如编译下面的代码不报错是否符合标准?
我试图在网站上搜索答案,但找不到任何相关问题。
template <class T>
int foo() {
some ill-formed code
return T::random_name();
}
template <>
int foo<int>() { return 0; }
int main() {
return foo<int>();
}
这是实施质量问题,格式不正确,但如果未实例化,则不需要根据 [temp.res#8.1]p:
进行诊断The validity of a template may be checked prior to any instantiation. [ Note: Knowing which names are type names allows the syntax of every template to be checked in this way. — end note ] The program is ill-formed, no diagnostic required, if:
- no valid specialization can be generated for a template or a substatement of a constexpr if statement within a template and the template is not instantiated, or
我们可以使用 -fdelayed-template-parsing
.
/permissive-
changes this. clang even has an MSVC compatibility mode to emulate this
我们可以看到 from this live godbolt using these two options clang 不再生成诊断信息,但 MSVC 可以。
函数 template
中的名称是 相关的 ,即实体以某种形式依赖于 template
参数,或者它们是 independent,即没有迹象表明它依赖于 template
参数。定义函数 template
时查找独立名称。在 template
实例化期间查找依赖名称,即在定义函数 template
时不需要定义名称。未能查找名称是一个错误。这个过程的细节有点复杂,并且在 template
s.
在您的例子中,some
是一个独立名称,而 T::
资格使 random_name
成为从属名称。