[C++] A a(B(x));

rosali

Это финиш. Руки пообрывать тому, кто придумал синтаксис С++!..


A a; //вызвать A::A(void)
A a(5); //вызвать A::A(int)
A a = A(5); //то же что и только что
A a = A(B(x; //вызвать B::B(typeof(x; вызвать A::A(B)
//кстати! ИЛИ вызвать x.operator B ...
//Причем разделить эти вещи в С++ нельзя, но это отдельный разговор...
A aB)x); //то же что и выше.


НО! Не дай вам бог написать нак как в subj, Потому что это forward declaration функции с именем a параметром типа B, который называется x, а тип возвращаемого значения у нее - A.

krishtaf

ну так
class B;
не спасает ?

lenabarskaya



class B
{
public:
B(int) {}
};
class A
{
public:
A(const B&) {}
};
int main
{
A a1(B(1;
A a2(2); // даже так можно
int x = 5;
A ax(B(x; // специально для КОНТРА
return 0;
}


Всё, естественно, компилицо и работает. По-моему, кое-кто объебался (?)

Ivan8209

1> A a(B(x;
2> A a1(B(1;
Между "1" и "2" разницу ощущаем?
---
...Я работаю антинаучным аферистом...

lenabarskaya

Ы?

Ivan8209

"1" может являться только именем константы целого типа.
В отличие от "x".
---
...Я работаю антинаучным аферистом...

lenabarskaya

"1" может являться только именем константы целого типа.
В отличие от "x".

И кого это ебёт, уважаемый? (с)

Ivan8209

Компилятор.
---
...Я работаю антинаучным аферистом...

lenabarskaya

Странно, но похоже, что мой компилятор это не ебёт Может быть, я что-то не так делаю?

rosali

Всё, естественно, компилицо и работает.

Если бы ты написал хоть какие-то действия внутри конструкторов, то понял бы, что не работает...


A ax(B(x;


эквивалентно


A ax(B x);


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


A ax(B(x;
ax.m;


если даже в классе A есть метод m...

lenabarskaya

Чорт, походу ты прав. Это песдец. Уползаю старательно выбатывать стандарт.
ЗЫ Похоже, это так ради совместимости с синтаксисом С. Надо поразбираться аккуратно.

aleks058

Может быть, можно
A ax = A(B(x;
?
Сорри, не могу проверить, но думаю, что это должно сработать.

rosali

A ax = A(B(x;

Так конечно работает, такую запись ни с чем нельзя спутать. Еще правильно работают такие варианты:


A aB)x);
A aB(x; // ;-D


Короче, все другие, крому subj. В bugzille к gcc даже есть несколько (сотен? ) записей, где это ошибкой посчитали (одна моя ) но это не ошибка, это (долбаный) стандарт...
Оставить комментарий
Имя или ник:
Комментарий: