Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
B b{A(i)};эту штуку компилятор уж никак не сможет спутать с функцией.
#include «iostream»(сразу извините за #include «iostream» — просто хабраредактор такое выдал при испльзовании больше/меньше) Этот пример не будет работать: ошибка линковки, поскольку в (2) какбэ вызывается обработчик, который не имеет реализации (тела). Но это легко поправить например так:
#include «typeinfo»
struct A {
A (double i) { std::cout << 'A' << '\n';}
};
struct B {
B (A a) { std::cout << 'B' << '\n';}
};
B ZZZ( A a ) { return B(A(1)); };
int main () {
int i = 2;
B b(A(i));
b(A(i)); // (2)
return 0;
}
#include «iostream»Тут всё корректно работает, поскольку мы объявили указатель на функцию и инициализировали его передав ему указатель на ZZZ (аналогия double — тип, double* — указатель на переменную double; B ()(A a) — функция, B (*)(A a) — указатель на функцию).
#include «typeinfo»
struct A {
A (double i) { std::cout << 'A' << '\n';}
};
struct B {
B (A a) { std::cout << 'B' << '\n';}
};
B ZZZ( A a ) { return B(A(1)); };
int main () {
int i = 2;
B (*b)(A(i)) = ZZZ;
b(A(i)); // (2)
return 0;
}
Это прототипы функций (forward declaration), которые будут объявлены позже.Приведите небольшой работающий пример использования таких прототипов и как они будут «объявлены позже». Вот мне не понятно где это они будут объявлены если область действия b ограничена функцией main(), а насколько мне известно, функции внутри функций делать нельзя, можно только выдавать вот такие прототипы.
void someFunc()
{
B b(A a); // если закомментировать эту строку, не будет линковаться
A a;
b(a);
}
B b(A a)
{
// do something and return B
}
...
int foo(int a);
int res = foo(10);
...
}Нихрена себе. Так тип — это тип или будущая переменная?Тип — это то, что описывает переменную, но ещё не переменная, в общем случае, по типу нельзя обратиться к чему либо внутри него (static и прочие подобные вещи не в счёт) и вообще что-то с ним делать — приходится создавать переменную или выделять память через new и пр.
B b(A(i)); // вот оно объявление сложного типаЭта запись аналог например такой:
class
{
public:
double ttt;
} m;Т.е. в данном случае происходит описание некоего неименнованого типа и происходит сразу создание переменной m этого неименованого типа. Для функции просто работает аналогия. Если неправ — тыкните в какое-нибудь описание или сами что-нить отпишите.
Неочевидная особенность в синтаксисе определения переменных