c – 实例化和名称绑定点

c – 实例化和名称绑定点,第1张

概述我对以下示例的实例化问题感到困惑: #include <iostream>void f(int){std::cout<<"int"<<std::endl;}//3template <typename T>void g(T t){ f(t);//4}void f(double){std::cout<<"double"<<std::endl;}int main(){ 我对以下示例的实例化问题感到困惑:

#include <iostream>voID f(int){std::cout<<"int"<<std::endl;}//3template <typename T>voID g(T t){    f(t);//4}voID f(double){std::cout<<"double"<<std::endl;}int main(){    g<int>(1);//1.point of instantiation for g<int>    g<double>(1.1);//2.point of instantiation for g<double>,so f(double) is visible from here?    return 0;}

我虽然f是一个从属名称,但是1是g<的实例化点. int>和2.是g< 2的实例化点. double>,所以对于g(1.1),f(double)是可见的,但输出是

intint

如果我在3处评论f(int)的声明,gcc报告错误(不是惊讶),并指出f(t)在4是实例化点(惊讶!!).

test.cpp: In instantiation of ‘voID g(T) [with T = int]’:test.cpp:16:10:   required from heretest.cpp:9:5: error: ‘f’ was not declared in this scope,and no    declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]  f(t);     ^

任何人都可以为我清除实例化和名称绑定的概念吗?

解决方法 f(t)是依赖的非限定函数调用表达式,因此只有在定义上下文中找到的函数和通过ADL找到的函数才是候选函数. f(int)在定义上下文中是可见的,但不是f(double),因此对于两个调用,重载决策都解析为f(int).

ADL无法找到f(double),因为内置类型没有关联的类或名称空间.如果传入类类型的参数,并且f类型的重载采用此类型,则ADL将能够找到它.例如:

voID f(int);template <typename T>voID g(T t){    f(t);}class A {};voID f(double);voID f(A);int main(){    g(1);   // calls f(int)    g(1.1); // calls f(int)    g(A{}); // calls f(A)}

调用f(A)是因为它位于全局命名空间中,而A的关联命名空间集是全局命名空间.

总结

以上是内存溢出为你收集整理的c – 实例化和名称绑定点全部内容,希望文章能够帮你解决c – 实例化和名称绑定点所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216775.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存