依山傍水房树间,行也安然,住也安然;一条耕牛半顷田,收也凭天,荒也凭天;雨过天晴骂小船,鱼在一边,酒在一边;夜晚妻子话灯前,今也谈谈,古也谈谈;日上三竿犹在眠,不是神仙,胜似神仙。
1. 反直觉的 Most Vexing Parse
什么是 Most Vexing Parse 呢?在 Wiki 中我们可以看到这样一个例子:
void f(double my_dbl) {int i(int(my_dbl));}
这个例子从直觉上说,应该这样来理解:我们现在有一个`int`类型的变量`i`,然后它通过构造函数来构造自己。这个构造函数传入了一个`int`类型的临时变量,这个临时变量是`my_dbl`类型转换过去的。<br />然而这个理解完全是错误的。实际上`i`是一个函数,它的返回值是`int`,然后会接受一个`int`作为它的参数,这个参数暂且叫做`my_dbl`。是不是非常的反直觉呢?<br />类似的,我们还可能会写出来这样的代码:
struct Timer {};struct TimeKeeper {explicit TimeKeeper(Timer t);int get_time();};int main() {TimeKeeper time_keeper(Timer());return time_keeper.get_time();}
`TimeKeeper time_keeper(Timer());`这看似是一个声明变量的语句,然后调用了构造函数,然而问题和上面是一样的:它同样是一个函数的声明。这个函数声明更加复杂。函数的参数也是一个函数,这个函数返回值是`Timer`而不接受任何参数。
2. 函数指针
通过这个契机,我多了解了一下函数指针
