我正在学习 C++11,我偶然发现了统一初始化器。
我不明白下面应该显示“最令人烦恼的解析”歧义的代码:
#include<iostream>
class Timer
{
public:
Timer() {}
};
int main()
{
auto dv = Timer(); // What is Timer() ? And what type is dv?
int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()" ?
return 0;
}
这里:
auto dv = Timer();
您有一个类型为 Timer
的对象称为 dv
正在从临时文件(=
符号右侧的表达式)进行复制初始化。
使用 auto
时要声明一个变量,该变量的类型与初始化它的表达式的类型相同——这里不考虑 cv 限定符和引用。
在您的例子中,初始化 dv
的表达式类型为 Timer
,等等 dv
类型为 Timer
.
这里:
int time_keeper(Timer());
您声明一个名为 time_keeper
的函数返回 int
并将一个指针作为其输入,指向一个返回Timer
的函数。并且不接受任何争论。
And why isn't the argument Timer (*) ()
?
函数在作为参数传递时会衰减为指针,因此 time_keeper
的类型实际上是 int(Timer(*)())
.
为了说服自己,您可以尝试编译这个小程序:
#include <type_traits>
struct Timer { };
int main()
{
int time_keeper(Timer());
static_assert(
std::is_same<
decltype(time_keeper),
int(Timer(*)())
>::value,
"This should not fire!");
}
这是一个live example .
我是一名优秀的程序员,十分优秀!