传递给const引用的C literal导致自动构造
发布时间:2020-12-16 10:00:24 所属栏目:百科 来源:网络整理
导读:如果我用一个整数作为参数调用“func(const generic ref)”(而不是’泛型’对象),将调用构造函数generic(int _a)来创建一个新对象. class generic {public: int a; generic() {} generic(int _a) : a(_a) { std::cout "int constructor was called!"; } gene
如果我用一个整数作为参数调用“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的泛型构造函数,并且没有其他转换允许执行相同的调用,因此编译器将获取构造调用路径. 编译器按从高优先级到低优先级的顺序检查三件事: >完全匹配 这意味着签名的完全匹配胜过需要促销的匹配,并且需要促销的匹配胜过需要转化的匹配. 有关如何应用隐式转换的信息,请参阅上面链接的文档的“隐式转换序列的排名”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |