Почему компилятор считает, что это функция? - PullRequest
1 голос
/ 16 июня 2019

У меня проблемы с распознаванием различий при инициализации объектов с помощью конструкторов.

Я также читал, что Бьярне рекомендует синтаксис {}, но в основном он эквивалентен синтаксису (), поэтому я думаю, что японять эту часть.

Проблема возникает в строке 40 с Car b();.

#include <iostream>
#include <conio.h>

class Car
{
public:
    Car() // initialize car
    {
        std::cout << "Default constructor called" << std::endl;
        ++carNumber;
    }
    ~Car() // destroy car
    {
        --carNumber;
    }

    static int getCarNumber() { return carNumber; };

private:
    static int carNumber;
};
int Car::carNumber = 0;

int main() {

    // Equivalent
    std::cout << "Car a{};" << std::endl;
    Car a{};
    std::cout << "Car d = Car{};" << std::endl;
    Car d = Car{};

    // Equivalent
    std::cout << "Car e;" << std::endl;
    Car e;
    std::cout << "Car c = Car();" << std::endl;
    Car c = Car();


    std::cout << "Car b(); " << std::endl;
    Car b(); // this line

    std::cout << "CarNumber: " << Car::getCarNumber() << std::endl;
    _getch();
    return 0;
}

Это вывод программы:

Car a{};
Default constructor called
Car d = Car{};
Default constructor called
Car e;
Default constructor called
Car c = Car();
Default constructor called
Car b();
CarNumber: 4

I'mпутать с "Автомобиль б ()".Я думаю, что компилятор интерпретирует его как функцию, которая возвращает Car, но если это так, я не вижу, где может быть реализована функция (это должно вызвать ошибку? ").

Я ожидал"Car b () "для вызова конструктора по умолчанию, который я сделал, но это не так.

1 Ответ

0 голосов
/ 16 июня 2019

Это одна из очевидных глупостей C ++.Грамматика настолько сложна, что компиляторам потребовались годы, чтобы договориться о том, что такое C ++, а что нет, и это даже официально неоднозначно.Неоднозначность решается правилом, которое более или менее гласит:

, если что-то неоднозначно и может быть как объявлением функции, так и определением объекта, то это объявление функции

Объявление функции, возвращающей Car без параметров и с именем b, будет

Car b();

, так что вот что получает компилятор.

Это абсурдное правило лежит в основе «самого неприятного синтаксического анализа » ловушки C ++.

Почему нужно объявлять функцию внутри блока кода?Никто не знает ... но вы можете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...