最令人头疼的解析混乱

2021-12-09 00:00:00 class function-pointers c++ c++11

我正在学习 C++11,我偶然发现了统一初始化程序.

I'm studying C++11 and I stumbled upon uniform initializers.

我不明白以下应该显示最令人烦恼的解析"歧义的代码:

I don't understand the following code which should show the "most vexing parse" ambiguity:

#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();

您有一个名为 dvTimer 类型的对象,它正在从临时对象(= 右侧的表达式)复制初始化代码> 符号).

You have an object of type Timer called dv that is being copy-initialized from a temporary (the expression on the right side of the = sign).

当使用 auto 声明一个变量时,该变量的类型与初始化它的表达式的类型相同――这里不考虑 cv 限定符和引用.

When using auto to declare a variable, the type of that variable is the same as the type of the expression that initializes it - not considering cv-qualifiers and references here.

在您的情况下,初始化 dv 的表达式的类型为 Timer,因此 dv 的类型为 Timer.

In your case, the expression that initializes dv has type Timer, and so dv has type Timer.

这里:

int time_keeper(Timer());

您声明了一个名为 time_keeper 的函数,它返回一个 int 并将指针作为它的输入,该函数返回一个 定时器,不带参数.

You declare a function called time_keeper that returns an int and takes as its input a pointer to a function which returns a Timer and takes no argument.

为什么不是参数 Timer (*) () ?

当作为参数传递时,函数衰减为指针,所以time_keeper的类型实际上是int(Timer(*)()).

Functions decay to pointers when passed as an argument, so the type of time_keeper is actually int(Timer(*)()).

为了说服自己,你可以尝试编译这个小程序:

To convince yourself, you could try compiling this little program:

#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!");
}

这里有一个referar">noliver>>.

Here is a live example.

相关文章