【问题标题】:static function lookup from a template function issue with xlC使用 xlC 从模板函数问题中查找静态函数
【发布时间】:2013-07-15 18:31:16
【问题描述】:

当我在寻找有关我在源代码中遇到的编译问题的线索时,我遇到了这个与函数查找相关的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 年的标准在哪里谈到了这一点?

【问题讨论】:

    标签: c++ templates name-lookup xlc


    【解决方案1】:

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

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

    对于依赖于模板参数的函数调用,如果函数名是非限定 ID 但不是 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) 的查找部分,仅在 找到模板定义上下文或模板实例化上下文。

    【讨论】:

    • C++11 放弃了外部链接要求,我读对了吗?
    • 这个答案可以使用摘要。
    【解决方案2】:

    V12.1 的编译器默认有新的行为。

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

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2012-05-22
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多