当我在源代码中寻找有关编译问题的线索时,我遇到了这个错误报告(针对 Mozilla 的 JavaScript 引擎源代码)与函数查找相关。引用错误报告:
TypedArrayTemplate(显然)是一个模板,它引用 INT_TO_JSVAL,一个静态内联函数,而不用“::”作为前缀。这会破坏 xlC,因为它无法解析 INT_TO_JSVAL。如果在模板参数的上下文中未找到非限定名称,则该标准不要求考虑静态。 g++ 执行此后备操作,xlC 则不执行此操作。
来自编译器的信息性消息:
(I) Static declarations are not considered for a function call if the function is not qualified.
就我而言,失败的代码类似于:
namespace N
{
static bool foo (std::string const &);
template <typename T>
void bar (T const &, std::string const & s)
{
// expected unqualified call to N::foo()
foo (s);
}
void baz (std::string const & s)
{
bar (s);
}
} // namespace N
xlC 实现的行为真的正确吗? 2003年或2011年的标准在哪里谈到了这个?
在 C++11 之前,这是正确的行为:模板中使用的名称的非限定名称解析被定义为仅查找具有外部链接的函数。
C++03 第 14.6.4.2 节候选函数 [temp.dep.candidate] 第 1 段:
对于依赖于模板参数的函数调用,如果函数名称是 unqualified-id 但不是
template-id,使用通常的查找规则(3.4.1,3.4.2)找到候选函数,除了:
在 C++11 中更改为:
对于依赖于模板参数的函数调用,可以使用通常的方法找到候选函数
查找规则(3.4.1、3.4.2、3.4.3),除了:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)