В чем смысл объявления 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;
}
Ответы
Ответ 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, из которого он был разработан, имел этот синтаксис. Таким образом, С++ унаследовал его.
Побочным эффектом этой обратной совместимости являются неприятные проблемы синтаксического анализа. Они недостаточно доказали, что оправдывают разрыв обратной совместимости.