Jan*_*šil 2 c++ language-lawyer
考虑以下程序:
struct A {
A(int){}
A(A const &){}
};
int main() {
A y(5);
}
Run Code Online (Sandbox Code Playgroud)
变量y使用表达式直接初始化5。重载分辨率选择构造函数A::A(int),这是我期望和想要的,但是为什么会发生呢?
可能是因为两个原因:
要么过载A::A(int)才是更好的匹配A::A(A const &),否则第二个根本不是可行的过载。
问题:在以上程序中,构造函数是否A::A(A const &)是可行的重载来初始化y?
是的,构造函数重载的规则与普通函数相同。如Ben Voigt所指出的,允许编译器对每个参数进行一次用户定义的转换,以使参数与参数匹配。在这种情况下,它可以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.
Run Code Online (Sandbox Code Playgroud)
因此,答案是肯定的,它是可行的重载,但未选择它,因为根据重载规则,A(int)构造函数是更好的匹配。
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |