从xlC的模板函数问题中查找静态函数

时间:2013-07-15 18:31:17

标签: c++ templates name-lookup xlc

在我搜索有关我的源代码中遇到的编译问题的线索时,我遇到了与函数查找相关的bug report (against Mozilla's JavaScript engine source)。引用错误报告:

  

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标准在哪里谈到这个?

2 个答案:

答案 0 :(得分:9)

在C ++ 11之前,这是正确的行为:模板中使用的名称的非限定名称解析被定义为仅查找具有外部链接的函数。

C ++ 03第14.6.4.2节候选函数[temp.dep.candidate]第1段:

  

对于依赖于模板参数的函数调用,如果函数名称是unqualified-id但不是a   template-id,使用通常的查找规则(3.4.1,3.4.2)找到候选函数,但:

     
      
  • 对于使用非限定名称查找(3.4.1)的查找部分,仅使用外部函数声明   找到模板定义上下文中的链接。

  •   
  • 对于使用关联命名空间(3.4.2)的查找部分,仅使用外部函数声明   找到模板定义上下文或模板实例化上下文中找到的链接。

  •   

将C ++ 11中的更改​​改为:

  

对于依赖于模板参数的函数调用,可以使用常规函数找到候选函数   查找规则(3.4.1,3.4.2,3.4.3),但:

     
      
  • 对于使用非限定名称查找(3.4.1)或限定名称查找(3.4.3)的查找部分,仅   找到模板定义上下文中的函数声明。

  •   
  • 对于使用关联命名空间(3.4.2)的查找部分,仅查找函数声明   找到模板定义上下文或模板实例化上下文。

  •   

答案 1 :(得分:4)

默认情况下,编译器的V12.1具有新行为。

如果您使用的是早期版本的xlC编译器,请使用选项-qdebug=KeepUnqualifiedStaticCandidate