Самый неприятный синтаксический анализ

Я получил код отсюда .

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() ) .

Это связано с тем, что 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(); } 
Interesting Posts

Как обнаружить, когда UIScrollView завершил прокрутку

Загрузка флеш-роликов из любого источника!

Зачем использовать hex?

Должны ли существовать функции classа / переменные перед их использованием?

Вызовите функцию перед основным

LInux: Как мне диагностировать / изолировать то, что вызывает «случайные» зависания и спонтанные перезагрузки?

Проверка адресов электронной почты с помощью jQuery и regex

Android 5.0 (L) Service Intent должен быть явным в аналитике Google

Можно ли использовать другую подпись в Outlook для внутренней или внешней почты?

Определите, работает ли Python внутри virtualenv

Как преобразовать словарь в строку JSON в C #?

Как открыть личные файлы, сохраненные во внутреннем хранилище с помощью Intent.ACTION_VIEW?

Как я могу определить только gradleиент для подграфа Tensorflow?

Как перечислить функции пространства имен?

Ошибка чтения диска всякий раз, когда я устанавливаю XP pro

Давайте будем гением компьютера.