Самый неприятный разбор - PullRequest
26 голосов
/ 08 мая 2011

Я получил код от здесь .

class Timer {
 public:
  Timer();
};

class TimeKeeper {
 public:
  TimeKeeper(const Timer& t);

  int get_time()
  {
      return 1;
  }
};

int main() {
  TimeKeeper time_keeper(Timer());
  return time_keeper.get_time();
}

Судя по всему, он должен получить ошибку компиляции из-за строки:

TimeKeeper time_keeper(Timer());

Но это происходит только при наличии return time_keeper.get_time();.

Почему эта строка вообще имеет значение, компилятор обнаружит неоднозначность в конструкции time_keeper(Timer() ).

1 Ответ

25 голосов
/ 08 мая 2011

Это связано с тем, что TimeKeeper time_keeper(Timer()); интерпретируется как объявление функции, а не как определение переменной. Это само по себе не является ошибкой, но когда вы пытаетесь получить доступ к get_time() члену time_keeper (который является функцией, а не экземпляром TimeKeeper), ваш компилятор завершается ошибкой.

Вот как ваш компилятор просматривает код:

int main() {
  // time_keeper gets interpreted as a function declaration with a function argument.
  // This is definitely *not* what we expect, but from the compiler POV it's okay.
  TimeKeeper time_keeper(Timer (*unnamed_fn_arg)());

  // Compiler complains: time_keeper is function, how on earth do you expect me to call
  // one of its members? It doesn't have member functions!
  return time_keeper.get_time();
}
...