[c++] сколько максимум апмерсэндов подряд может быть в программе?
а я вот такую задачку придумал: придумать пример, когда C-style каст невозможно выразить через C++ касты (static, dynamic, reinterpret) (поведение кастов регламентируется стандартом, а не конкретным компилятором, поэтому примеры, опирающиеся на особенность компилятора неинтересны)
когда C-style каст невозможно выразить через C++ касты (static, dynamic, reinterpret) (поведение кастов регламентируется стандартомесли поведение кастов регламентируется стандартом, то никогда
что-нибудь в шаблончике, когда неизвестно, встроенный тип или класс там с множественным наследованием
что-нибудьочень расплывчатый пример
template<class F, class T>
T to(const F& from)
{
return (T)from;
}
чтобы так же универсально кастил. т.е. по сути не реализуешь сам универсальный каст
ну т.е. вот буквальнопопробую внести
есть у меня выражение типа
бла1 = (гыгы)бла2тут "мудрый" заявляется, что C-style deprecated, берет в руки могучие C++ касты.....и не может ничего поделать
Бывает что-то подобное и осмысленное, вроде приведения с проверкой попадания в диапазон. А static_cast не даст указатель, например, преобразовать в int.
ну вот в моем примереищется пример с конкретными типами
пример на понимание особенности работы типов в c++
ищется пример с конкретными типамивот, так бы сразу и сказал, это куда интереснее
так бы сразу и сказалну твою задачу тоже можно легко решить вот так, но я же не предлагаю такое, потому что понимаю условие
вот пропеллерман тоже понял задачу, судя по ответу
потому что понимаю условиену вот это ключевое, а я твое сначала не понял.
Но это же ацкий чит, нафига такое делать? Поэтому может и депрекэйтед
приведение к базовому приватному классууже тепло =)
осталось соорудить пример
больше трех не получается
> На самом деле можно начать попроще: с плюсов и минусов.
плюсов и минусов может быть бесконечно большое число
class A {
public:
A() : x(1) {}
virtual ~A() {}
int x;
};
class C {
public:
C() : y(2) {}
virtual ~C() {}
void g()
{
cout << "C::" << y << endl;
}
int y;
};
class B : private A, private C {
public:
void f()
{
C* p = static_cast<C*>( this );
p->g();
}
};
int main()
{
B b;
((C*)( &b ))->g();
return 0;
}
плюсов и минусов может быть бесконечно большое числокак сделать нечетное? (это так, для затравки, вопрос-то очень простой)
больше трех не получаетсяну ты ведь понимаешь, что если бы ответ был 3, то это бы было не интересно, да и не про C++
как сделать нечетное? (это так, для затравки, вопрос-то очень простой)перегрузить унарный оператор -
ну ты ведь понимаешь, что если бы ответ был 3, то это бы было не интересно, да и не про C++у меня лексер ругается, что ему не нравится второй подряд &&, пока не понимаю как его обойти..
у меня лексер ругается, что ему не нравится второй подряд &&, пока не понимаю как его обойти..лексер? А ему не пофигу? Какой компилятор? Я только на gcc, кстати, тестил, но это по стандарту по идее все.
лексер? А ему не пофигу? Какой компилятор? Я только на gcc, кстати, тестил, но это по стандарту по идее все.в ideone работает?
сработало
теперь его можно там найти
блин, ты меня развел, там же gcc
O_O это какие-то C Extensions, они у Саттера не используются, там чистый стандартный Си++. Но с их помощью вроде бы больше все равно не удастся сделать
лексер? А ему не пофигу?лексер выдает лексему && вместо двух лексем & & и синтаксис ломается
т.е. вот такое по смыслу должно работать, но не компилится пока пробелы не вставишь:
class Z
{
public:
Z operator & ()
{
return *this;
}
};
int main()
{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Z();
}
так это известная фича, лексер жадный, да, такая последовательность всегда разбирается как пары &&, так по смыслу и есть. единственное исключение — это с некоторых пор в шаблонах две закрывающих угловых скобки стали распознаваться.
ну т.е. три у тебя получилось. и ты понимаешь, что && бинарный, т.е. хочется еще что-то "унарное", начинающееся или заканчивающееся на амперсанды подогнать к &&&. Вот и вопрос, как это сделать.
начинающееся или заканчивающееся на амперсанды подогнать к &&&начинающееся не подойдет - лексер не даст, необходимо заканчивающееся, а мне что-то ничего в голову не приходит, но я еще подумаю.
что означает запись?
int && x = 12;
rvalue reference
если бы было c++0x, я бы предупредил
начинающееся не подойдет - лексер не даст, необходимо заканчивающееся, а мне что-то ничего в голову не приходит, но я еще подумаю.ну да! Осталось немного фантазии Что может заканчиваться на && ? чистый C++, никаких трюков
ищется пример с конкретными типамикстати, вот все-таки, неужели это желательное поведение? Это же явное нарушение инкапсуляции и "мудрый" бы сказал, что такое делать ай-ай-ай, разве нет?
пример на понимание особенности работы типов в c++
И почему оно вообще работает, кстати?
ок, ладно, имхо, это из-за того, что в сях он мог кастить любые указатели, поэтому тут просто так отбирать это не хотят. Но решили сделать, чтобы он достойно работал с классами, а не был как reinterpret_cast. Ня?
class C {
public:
bool operator&() { return true;}
};
int main(int argc, char*argv[]) {
C c;
bool i = true &&& c;
cout << i << endl;
return 0;
}
или я недопонял что вы тут обсуждаете?
и неясно зачем эти извращения, если в Си можно три сделать точно так же
хз правда что там со стандартом
int main(int argc, char*argv[]) {
c:
bool i = true &&&& c;
cout << i << endl;
return 0;
}
надо больше 4х
Что может заканчиваться на && ? чистый C++, никаких трюковхз, сдаюсь. По памяти ничего не вспоминается, в списке постфиксного оператора (или заканчивающегося на) && тоже нет: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B.
значит это не оператор, а какая-то неведомая синтаксическая фигня , может быть связанная с типами или функциями - у них зубодробительный синтаксис
значит это не оператор, а какая-то неведомая синтаксическая фигнявполне ведомая, ты писал в своей программе выше
Вообще, в приват пришло правильное решение от , апплодисменты
У него решение даже много лаконичнее моего, пускай кинет ссылку на ideone
5 или 6?
вообще-то тут в треде уже пришли к логическому выводу Тут ломают голову над тем, как бы сделать два бинарных оператора подряд, но чтобы можно было сделать сразу три, это сильно. Пять короче
Правда это из-за того, что тут в треде задали тон на решения, выходящие за стандарт, адресов меток там нету это чисто gcc
за счёт GNU Extension'а?
если совместить предложения и -а, то можно 6 сделать: на ideone - работает, в VS - нет
ну да, писать никому не стоит, пожалуй
http://ideone.com/veOu8
после подсказки "Что может заканчиваться на &&?" стало совсем просто
как я понял, тут все заинтересованные уже догадались до решения, но раз уж явно просил:
после подсказки "Что может заканчиваться на &&?" стало совсем просто
http://ideone.com/DSU3Q - с 6-ю
это не стаднарт, обсудили же. Но круто все равно, да
class D {
};
class E: D {
};
int main()
{
E d;
(D *)&d;
// static_cast<D *>(&d);
}
В твоем примере эффект он него такой же, как и от сишного каста.
О, кстати, правильно ли я определяю:
Определение. Говорят, что тип B наследует типу A, если существует отображение I: B→A, не являющееся ни конструкцией, ни приведением типов, ни функцией, ни оператором. Область видимости I называется областью видимости наследования.
?
не универсальное средство, а пример, где нельзя выразить сишный каст через плюсовые не прибегая к магии. В твоем примере можно заменить.
Ну в смысле, универсальное для всех кастов.
так-то нельзя же сделать static_cast<void*>( 48 )
reinterpret_cast<C*>(reinterpret_cast<char *>(&b) + sizeof(A))->g();
reinterpret_cast<C*>(reinterpret_cast<char *>(&b) + sizeof(A))->g();сдвиг баз не регламентирован, поэтому здесь имеем UB
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Empty_Base_...
ТС привел правильный пример, имхо
Оставить комментарий
Serab
Была такая глава в саттере в конце шуточная, а тут я решил вспмонить, но что-то долго не мог, и не гуглилось. А вот сейчас вспомнил. Кому интересно, могут поломать головуНа самом деле можно начать попроще: с плюсов и минусов.
т.е. надо именно без пробелов подряд, типа ++++i, оно работает всегда, но надо побольше
Блин, с плюсами накосячил, тут не максимум, а вообще вопрос: сколько может быть...