首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >复制构造函数是可行的重载吗?

复制构造函数是可行的重载吗?
EN

Stack Overflow用户
提问于 2019-05-07 14:18:46
回答 2查看 93关注 0票数 3

考虑以下方案:

代码语言:javascript
运行
复制
struct A {
  A(int){}
  A(A const &){}
};

int main() {
  A y(5);
}

变量y是用表达式5.The重载解析直接初始化的,它选择构造函数A::A(int),这正是我所期望和希望的,但是为什么会发生这种情况呢?

这种情况可能有两个原因:

要么重载A::A(int)A::A(A const &)更匹配,要么第二个根本不是可行的重载。

问:在上面的程序中,构造函数A::A(A const &)是否是y初始化的可行重载?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-07 14:25:22

是的,构造函数重载的规则与普通函数相同。编译器允许对每个参数进行用户定义的转换(如Ben所指出的那样),以便将参数与参数匹配。在这种情况下,它可以通过int->A通过A(5)执行

这种情况与以下情况相同:

代码语言:javascript
运行
复制
void foo(const std::string&);
void bar(const std::string&);//1
void bar(const char*);//2

//...
foo("Hello");//Is allowed
bar("Hello");//Calls 2 as it matches exactly without a need for conversion.

因此,答案是肯定的,它是可行的重载,但是没有选择它,因为根据超载规则A(int)构造函数是一个更好的匹配。

票数 6
EN

Stack Overflow用户

发布于 2019-05-07 14:28:13

[class.conv.ctor]/1

不显式的构造函数(dcl.fct.spec)指定从参数类型(如果有的话)到类类型的转换。这种构造函数称为转换构造函数。  示例: 结构X{ X( int );X(const char*,int =0);X(int,int);};void f(X arg) {X= 1;// a= X(1) X= "Jessie";// b=X(Jessie,0)a= 2;// a= X(2) f(3);// f(X(3)) f({1,2});// f(X(1,2)) } - end示例 

[over.match.copy]/1

假设“cv1 T”是被初始化对象的类型,而T是类类型,则选择候选函数如下: (1.1) T的转换构造函数是候选函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56024688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档