Самый досадный разбор
Я получил код от здесь.
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 ответов
Это связано с тем, что 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();
}