use*_*149 2 c++ constructor explicit
我遇到了类的问题,将一个const对象(多态结构)传递给一个显式构造函数,该构造函数对该多态结构的基类进行了const引用.这是示例(这不是我的代码,这里是解释)
class Base
{
...
}
class Derived:public Base
{
...
}
class Problem
{
Problem(const Base&);
...
}
void myFunction(const Problem& problem)
{
...
}
int main()
{
//explicit constructor with non const object
Derived d;
Problem no1(d); //this is working fine
myFunction(no1);
//implicit constructor with const object
Problem no2=Derived(); //this is working fine, debugged and everything called fine
myFunction(no2); //is working fine
//explicit constructor with const object NOT WORKING
Problem no3(Derived()); //debugger jumps over this line (no compiler error here)
myFunction(no3); //this line is NOT COMPILING at all it says that:
//no matching function for call to myFunction(Problem (&)(Derived))
//note: candidates are: void MyFunction(const Problem&)
}
Run Code Online (Sandbox Code Playgroud)
只有当我将Derived对象显式地转换为它的基类Base时,似乎它与第二个版本(显式构造函数调用问题)一起工作正常:
Problem(*(Base*)&Derived);
Run Code Online (Sandbox Code Playgroud)
我没有意识到有问题和明确地调用Problem类的构造函数之间的区别.谢谢!
小智 6
问题是你没有声明一个对象,而是一个函数:
Problem no3(Derived());
// equivalent to:
Problem no3(Derived); // with parameter name omitted
Run Code Online (Sandbox Code Playgroud)
使用:
Problem no3((Derived()));
// extra parens prevent function-declaration interpretation
// which is otherwise required by the standard (so that the code isn't ambiguous)
Run Code Online (Sandbox Code Playgroud)
这是C++继承的C语句声明的一个怪癖.
更多例子:
void f(int(a)); /* same as: */ void f(int a);
void g() {
void function(int); // declare function
void function(int()); // we can declare it again
void function(int=42); // add default value
function(); // calls ::function(42) ('function' in the global scope)
}
// 'function' not available here (not declared)
void function(int) {} // definition for declarations inside g above
Run Code Online (Sandbox Code Playgroud)