«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Самый неприятный анализ: Timer() — вызов объекта или функции?

Самый неприятный анализ: Timer() — вызов объекта или функции?

Опубликовано 21 декабря 2024 г.
Просматривать:126

The Most Vexing Parse: Timer() - Object or Function Call?

Самая неприятная двусмысленность синтаксического анализа в C 11. как показано в следующем коде фрагмент:

#include класс Таймер { публика: Таймер() {} }; интервал основной() { авто dv = Таймер(); // Неоднозначность: вызов объекта или функции? int time_keeper(Таймер()); // Неоднозначность: указатель или вызов? вернуть 0; }

#include 

class Timer
{
public:
    Timer() {}
};

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}

В первом выражении ключевое слово auto подразумевает, что тип dv выводится из инициализатора справа от знака равенства (=). Инициализатор — это вызов конструктора Timer без аргументов, который возвращает объект Timer. Следовательно, dv является объектом типа Timer.

Понимание второго выражения (int time_keeper(Timer()))

Во втором выражении неоднозначность возникает, поскольку компилятор не может определить, является ли Timer() вызовом функции или объектом типа Timer, передаваемым по ссылке.

Если Timer() вызов функции, затем int time_keeper(Timer()) объявляет функцию с именем time_keeper, которая принимает объект Timer в качестве входных данных и возвращает int.

    Если Timer() является объектом типа Timer, то int time_keeper( Timer()) объявляет функцию time_keeper, которая принимает указатель на объект Timer в качестве входных данных и возвращает целое число.
  • Однако, поскольку функции распадаются на указателей, передаваемых в качестве аргументов, истинным типом time_keeper является int(Timer(*)()), что устраняет неоднозначность в пользу интерпретации указателя на функцию.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3