8

我正在学习 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;
}
4

1 回答 1

11

这里:

auto dv = Timer();

您有一个类型Timer为称为的对象,该对象正在从临时(符号dv右侧的表达式)复制初始化。=

用于auto声明变量时,该变量的类型与初始化它的表达式的类型相同 - 此处不考虑 cv 限定符和引用。

在您的情况下,初始化的表达式dv具有 type Timer,因此dv具有 type Timer

这里:

int time_keeper(Timer());

您声明了一个调用的函数,该函数time_keeper返回 an并将一个指向返回 a且不带参数的函数的指针int作为其输入。Timer

为什么不是论点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!");
}

这是一个活生生的例子

于 2013-06-12T08:18:29.807 回答