问题描述
假如有如下示例:
//类Timer
class Timer{
public:
Timer(){ cout << "Timer()"<<endl; }
}
//类TimeKeeper
class TimeKeeper{
public:
TimeKeeper(const Timer& t)
{
cout << "TimeKeeper()"<<endl;
}
}
int main(){
TimeKeeper timekeeper( Timer() );
return 0;
}
对于main函数里的调用:TimeKeeper timekeeper( Timer() ),我们会认为是声明一个Timekeeper类型的变量,使用一个Timer类型的对象引用来初始化。
但实际上在运行的时候编译器报出如下警告
而运行结果也不是预期的输出
编译器认为我们声明了一个timekeeper函数,该函数的参数是指向返回类型Timer(并且不输入)的函数的指针,并且返回一个Timekeeper类型的对象。
解决方法
- 可以在参数的外面多加一个括号
TimeKeeper timekeeper( ( Timer() ) )
,强制使编译器把timekeeper视为一个变量; - 使用C++11引入的新特性,使用大括号作为统一初始化语法
TimeKeeper timekeeper{ Timer() };
同样可以解决问题。