考虑以下方案:
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
初始化的可行重载?
发布于 2019-05-07 14:25:22
是的,构造函数重载的规则与普通函数相同。编译器允许对每个参数进行用户定义的转换(如Ben所指出的那样),以便将参数与参数匹配。在这种情况下,它可以通过int->A
通过A(5)
执行
这种情况与以下情况相同:
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)
构造函数是一个更好的匹配。
发布于 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示例
和
假设“cv1 T”是被初始化对象的类型,而T是类类型,则选择候选函数如下: (1.1) T的转换构造函数是候选函数。
https://stackoverflow.com/questions/56024688
复制相似问题