传递给const引用的C literal导致自动构造

传递给const引用的C literal导致自动构造,第1张

概述如果我用一个整数作为参数调用“func(const generic& ref)”(而不是’泛型’对象),将调用构造函数generic(int _a)来创建一个新对象. class generic {public: int a; generic() {} generic(int _a) : a(_a) { std::cout << "int construc 如果我用一个整数作为参数调用“func(const generic& ref)”(而不是’泛型’对象),将调用构造函数generic(int _a)来创建一个新对象.

class generic {public:    int a;    generic() {}    generic(int _a) : a(_a) {        std::cout << "int constructor was called!";    }    generic(const generic& in) : a(in.a) {        std::cout << "copy constructor was called!";    }};voID func(const generic& ref) {    std::cout << ref.a;}int main() {    generic g(2);    func(g); // this is good.    func(generic(4)); // this is good.    func(8); // this is good...... ?    return 0;}

最后一个“func(8)”调用使用构造函数generic(int _a)创建一个新对象.这种建筑有名字吗?程序员不应该在传递参数之前显式构造一个对象吗?像这样:

func(generic(8));

单独传递整数是否有任何好处(除了节省时间)?

解决方法 此行为是 overload resolution流程的一部分 – 具体而言.

当您调用func()时,编译器会构造候选列表.只有一个候选者,func(const generic& ref),所以编译器试图找出如何进行调用.

它看到没有定义func(int),因此它试图找到从int到generic的转换路径.由于存在一个带有int的泛型构造函数,并且没有其他转换允许执行相同的调用,因此编译器将获取构造调用路径.

编译器按从高优先级到低优先级的顺序检查三件事:

>完全匹配
>促销
>转换

这意味着签名的完全匹配胜过需要促销的匹配,并且需要促销的匹配胜过需要转化的匹配.

有关如何应用隐式转换的信息,请参阅上面链接的文档的“隐式转换序列的排名”.

总结

以上是内存溢出为你收集整理的传递给const引用的C literal导致自动构造全部内容,希望文章能够帮你解决传递给const引用的C literal导致自动构造所遇到的程序开发问题。

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

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

原文地址:https://www.54852.com/langs/1217031.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存