gpt4 book ai didi

c++ - 关于C++模板中自由函数名解析的问题

转载 作者:太空狗 更新时间:2023-10-29 21:32:30 26 4
gpt4 key购买 nike

这个程序按预期工作:

#include <iostream>

template <typename T>
void output(T t) {
prt(t);
}

struct It {
It(int* p) : p(p) {}
int* p;
};

void prt(It it) {
std::cout << *(it.p) << std::endl;
}

int main() {
int val = 12;
It it(&val);
output(it);
return 0;
}

当您编译并执行它时,它会按预期打印“12”。尽管 output 模板函数所需的函数 prt 是在 output 之后定义的,但 prt 可见于实例化点,因此一切正常。

下面的程序与上面的程序非常相似,但是编译失败:

#include <iostream>

template <typename T>
void output(T t) {
prt(t);
}

void prt(int* p) {
std::cout << (*p) << std::endl;
}

int main() {
int val = 12;
output(&val);
return 0;
}

此代码试图做与前面示例相同的事情,但在 gcc 8.2 中失败并显示错误消息:

     'prt' was not declared in this scope, and no declarations were found by
argument-dependent lookup at the point of instantiation [-fpermissive]

唯一改变的是传递给output 的参数是内置类型,而不是用户定义的类型。但我认为这对名称解析无关紧要。所以我的问题是:1)为什么第二个例子失败了? 2) 为什么一个示例失败而另一个示例成功?

最佳答案

适用于此处的标准规则可在 [temp.dep.candidate] 中找到:

For a function call where the postfix-expression is a dependent name, the candidate functions are found using the usual lookup rules ([basic.lookup.unqual], [basic.lookup.argdep]) except that:

  • For the part of the lookup using unqualified name lookup, only function declarations from the template definition context are found.

  • For the part of the lookup using associated namespaces ([basic.lookup.argdep]), only function declarations found in either the template definition context or the template instantiation context are found.

在这两个示例中,非限定名称查找都没有找到 prt 的声明,因为在定义模板的位置之前没有这样的声明。因此,我们继续进行依赖于参数的查找,它仅在参数类型的关联命名空间中查找。

Class It 是全局命名空间的成员,因此全局命名空间是一个关联的命名空间,并且一个声明在模板实例化上下文中的该命名空间内可见。

指针类型 U* 与类型 U 具有相同的关联命名空间,而基本类型根本没有关联的命名空间。因此,由于唯一的参数类型 int* 是指向基本类型的指针,没有关联的命名空间,并且依赖于参数的查找不可能在第二个中找到任何声明程序。

我不能确切地说出为什么这样设计规则,但我猜其意图是模板应该使用它打算使用的特定声明函数,或者使用函数作为可扩展的自定义点,但是这些用户定制需要与他们将使用的用户定义类型密切相关。否则,可以通过为某些特定情况提供更好的重载来更改真正意味着使用一个特定函数或函数模板声明的模板的行为。不可否认,这更多是从模板定义上下文中何时至少有一个声明的角度来看,而不是从该查找根本找不到任何东西的角度来看,但随后我们会遇到 SFINAE 指望找不到东西的情况,等等。

关于c++ - 关于C++模板中自由函数名解析的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com