Подтвердить что ты не робот

В чем смысл объявления MyType (myVar) в С++?

В стандарте С++ 11 мы можем объявить переменную необычным способом. Мы можем объявить myVar как int(myVar); вместо int myVar. В чем смысл этого?

#include <iostream>
using namespace std;

int main() {
    int(myVar);
    myVar = 1000;
    cout << myVar << endl;
    return 0;
}

UPD На самом деле есть определенная причина, почему я спросил об этом. То, что выглядело невиновным, просто перестало компилироваться, когда мы попытались перенести некоторый код из MSVC С++ 03 в GCC С++ 11. Вот пример

    #include <iostream>
    using namespace std;

    struct MyAssert
    {
        MyAssert(bool)
        {
        }
    };

    #define ASSERT(cond) MyAssert(cond)

    void func(void* ptr)
    {
        ASSERT(ptr); // error: declaration of ‘MyAssert ptr’
                    // shadows a parameter #define ASSERT(cond) MyAssert(cond)
    }

    int main()
    {
        func(nullptr);
        return 0;
    }
4b9b3361

Ответ 1

Конечно. Я даже могу это сделать:

int (main)()
{
}

Скобки служат для группировки вещей в C и С++. Они часто не имеют дополнительного значения, кроме группировки. Вызов функций/деклараций/определений немного особенный, но если вам нужно убедить в том, что нам не следует их пропускать, просто взгляните на Ruby, где скобки будут необязательными в вызовах функций.

Нет необходимости в этом. Но иногда возможность ударить по некоторым теоретически ненужным круглым скобкам помогает сделать код более удобным для чтения. Не в вашем конкретном примере, а не в моем, конечно.

Ответ 2

#include <typeinfo>
#include <iostream>

int     main(void)
{
  int   *first_var[2];
  int   (*second_var)[2];

  std::cout << typeid(first_var).name() << std::endl;
  std::cout << typeid(second_var).name() << std::endl;

  return 0;
}

Запуск этого на моем компьютере дает:

A2_Pi
PA2_i

Скобки в объявлении в основном служат той же цели, что и везде, группируют вещи, которые должны быть вместе независимо от приоритетного порядка приоритета языка. Конечно, скобки с только одним элементом внутри эквивалентны простому набору этого элемента, за исключением случаев, когда скобки являются обязательными (например, вызовы функций).

Ответ 3

С++ не нарушает обратную совместимость, если он может помочь.

C, из которого он был разработан, имел этот синтаксис. Таким образом, С++ унаследовал его.

Побочным эффектом этой обратной совместимости являются неприятные проблемы синтаксического анализа. Они недостаточно доказали, что оправдывают разрыв обратной совместимости.