Автор Тема: C++ инициализация ссылок  (Прочитано 56217 раз)

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #30 : Март 18, 2013, 09:52:47 am »
сорри, одинокая t - в выражениях случайный артефакт...

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #31 : Март 18, 2013, 10:11:39 am »
А на хрена нам нужно эмулировать первое выражение с помощью указателей?  )
Лично я вижу пока  2 пункта:
1. Вы... нуться
2. Отгрести потенциальный геморрой в  будущем..
 :D

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #32 : Март 18, 2013, 04:16:51 pm »
в чем прелесть
const int t& b = rvalue; в сравнении с const int t b = rvalue;? (именно для этого специального случая  - когда rvalue ЗНАЧЕНИЕ соответствующего типа ;)

В том, что нет копирования в сучае, если rvalue - тоже ссылка (конкретно для интов, конечно, не акутально)?
X const& f();
X const& x1 = f(); // нет копирования
X const x2 = f(); // есть копирование

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #33 : Март 18, 2013, 06:08:19 pm »
в чем прелесть
const int t& b = rvalue; в сравнении с const int t b = rvalue;? (именно для этого специального случая  - когда rvalue ЗНАЧЕНИЕ соответствующего типа ;)

В том, что нет копирования в сучае, если rvalue - тоже ссылка (конкретно для интов, конечно, не акутально)?
X const& f();
X const& x1 = f(); // нет копирования
X const x2 = f(); // есть копирование

  ;D  Влад - не юлите..  я спрашивал вас ровно про тот случай  который просил эмулировать Алексей - а не ту очевидную хрень , на которую вы пытаетесь заострить внимание..

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #34 : Март 18, 2013, 07:57:01 pm »
в чем прелесть
const int t& b = rvalue; в сравнении с const int t b = rvalue;? (именно для этого специального случая  - когда rvalue ЗНАЧЕНИЕ соответствующего типа ;)

В том, что нет копирования в сучае, если rvalue - тоже ссылка (конкретно для интов, конечно, не акутально)?
X const& f();
X const& x1 = f(); // нет копирования
X const x2 = f(); // есть копирование

  ;D  Влад - не юлите..  я спрашивал вас ровно про тот случай  который просил эмулировать Алексей - а не ту очевидную хрень , на которую вы пытаетесь заострить внимание..

Чтобы было понятней Владу и все остальным, вот модифицированный текст того примера. Нужно показать пальцем, то есть поставить эксперимент который выявит различие семантики для "const O&" и "const O":

#include <iostream>
using namespace std;
struct O {
int foo;
        O(int i) : foo(i) {cout << "O(" << i <<")\n";}
~O(){cout << "~O(" << foo << ")\n";}
};

int i=0;
O foo() {
    O o(i++);
    return o;
}

int main() {
    {const O& o0 = foo();}
    {const O o1  = foo();}
    return 0;
}
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #35 : Март 18, 2013, 08:02:24 pm »
Чтобы было понятней Владу и все остальным, вот модифицированный текст того примера. Нужно показать пальцем, то есть поставить эксперимент который выявит различие семантики для "const O&" и "const O":

#include <iostream>
using namespace std;
struct O {
int foo;
        O(int i) : foo(i) {cout << "O(" << i <<")\n";}
~O(){cout << "~O(" << foo << ")\n";}
};

int i=0;
O foo() {
    O o(i++);
    return o;
}

int main() {
    {const O& o0 = foo();}
    {const O o1  = foo();}
    return 0;
}

Да, естественно тип O можно менять как угодно. Ну и в main'e можно что-нибудь дописывать.
Y = λf.(λx.f (x x)) (λx.f (x x))

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #36 : Март 19, 2013, 04:01:40 am »
А буквы O и o были выбраны чтобы понятней было?
"o0" - это, конечно, сильно.
Сильно усугубляет блевотность.

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #37 : Март 19, 2013, 04:43:46 am »
А буквы O и o были выбраны чтобы понятней было?
"o0" - это, конечно, сильно.
Сильно усугубляет блевотность.
ну да.. не без вы.. ой программерской эстетики  :D , но если не нравится - используйте вместо структуры обычный встроенный тип - например int, соответственно и функция должна возвращать значение этого же типа.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #38 : Март 19, 2013, 07:06:54 am »
А буквы O и o были выбраны чтобы понятней было?
"o0" - это, конечно, сильно.
Сильно усугубляет блевотность.
ну да.. не без вы.. ой программерской эстетики  :D , но если не нравится - используйте вместо структуры обычный встроенный тип - например int, соответственно и функция должна возвращать значение этого же типа.
Нет, нельзя.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: C++ инициализация ссылок
« Ответ #39 : Март 19, 2013, 10:12:58 am »

Нет, нельзя.
Ну.. ладно оО, так оО

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #40 : Март 19, 2013, 11:49:39 am »
Не оО, а o0.
 8)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #41 : Март 19, 2013, 12:50:45 pm »
а лучше всё же о_О
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #42 : Март 19, 2013, 01:00:56 pm »
Чтобы было понятней Владу и все остальным, вот модифицированный текст того примера. Нужно показать пальцем, то есть поставить эксперимент который выявит различие семантики для "const O&" и "const O":

Могу предположить, что в случае "const O" будет UB при попытке последующего const_cast. Но на практике разницы не будет (сомневаюсь, что какой-то компилятор будет класть такую локальную переменную в RO-память). На практике скорее найдется компилятор, который сделает лишнее копирование для случая "const O" (помню борланд чем-то таким похожим страдал).

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #43 : Март 19, 2013, 02:05:52 pm »
Чтобы было понятней Владу и все остальным, вот модифицированный текст того примера. Нужно показать пальцем, то есть поставить эксперимент который выявит различие семантики для "const O&" и "const O":

Могу предположить, что в случае "const O" будет UB при попытке последующего const_cast. Но на практике разницы не будет (сомневаюсь, что какой-то компилятор будет класть такую локальную переменную в RO-память). На практике скорее найдется компилятор, который сделает лишнее копирование для случая "const O" (помню борланд чем-то таким похожим страдал).
Я проверял на gcc и clang - нигде лишних копирований нет в данном коде. На самом деле я подозреваю, что может быть разница если функцию foo засунуть в отдельную динамическую либу (aka .so) -- в этом случае у компилятора меньше возможностей суровой оптимизации.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: C++ инициализация ссылок
« Ответ #44 : Март 19, 2013, 02:08:25 pm »
Я проверял на gcc и clang - нигде лишних копирований нет в данном коде. На самом деле я подозреваю, что может быть разница если функцию foo засунуть в отдельную динамическую либу (aka .so) -- в этом случае у компилятора меньше возможностей суровой оптимизации.

Впрочем, наверняка и статическую либу можно (.a) попробовать.
Y = λf.(λx.f (x x)) (λx.f (x x))