Russian Qt Forum
Ноябрь 22, 2024, 05:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: c++ новый стандарт (комитет)  (Прочитано 26323 раз)
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #45 : Декабрь 11, 2019, 09:54 »

Запрет использования методов, если объект не является rvalue

Ладно, будем считать что убедили.
Подправте мои выводы:

Вызов метода без возращаемого значения (void method() &&) может оптимизировать код (не понятно как, но что-то связано с расположеним объекта). Также в зависимости от архитектуры вашего класса, вы можете разрешить использование некоторых функций только для временных объектов. Накладывая такое ограничение,  вы даете понять ....... Ну, что то да даете понять Улыбающийся
« Последнее редактирование: Декабрь 11, 2019, 10:13 от Azazello » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #46 : Декабрь 11, 2019, 14:44 »

Ну или Igors - ну понятно! Ну, вам понятно, помогите  мне понять.
Случай не такой уж фантастичный. Напр объект имеет уникальное ID, хорошо если можно отделаться железно запретив копирование, но это не всегда удается. И тогда выгодно знать или это "нормальный" объект или "времянка" что скоро убьется (не обращайте внимание на мелкие подробности типа "регистров" и.т.п). "Руками" выходит довольно коряво
Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #47 : Декабрь 11, 2019, 21:00 »

Я уже вот тоже думаю, чего это я так прицепился, ну есть, то есть. Значит кому то нужно.
Хочу закрыть тему.

Часто использую академический С++, где важен сам пример и принцип, поэтому такое внимание к деталям - это к чему: типа чего приципился.

Нашел академическое применение данного метода.

Код:
class Logging {

bool connectToLogServer();
bool isConnected();

void logging(std::string& msg) { if (!isConnected()) return; std::cout << msg; }
void logging(std::string& msg) && { connectToLogServer(); std::cout << msg; }

}

Использование понятно - создав объект постоянным, мы экономим ресурсы на подсоединения к серверу, раз подсоединившись и пуляя сообщения.

Код:
{
    Logging log;
    log.connectToLogServer();

    log.logging("sfsfds");
    log.logging("sfsfds2");

}

Когда же нам нужно "здесь и сейчас", мы вызываем "временную функцию".

Код:
Logging().logging("sfsfds");

Почему же оно академическое? Мы не знаем, записало оно или нет. Но думаю есть  случаи где это не важно (на то он и лог, в какой лог писать, что лог не работает), а во вторых есть исключения (exception).

Конечно, мы можем усовершенствовать данный класс, проверяя каждый раз наличие соединения, и если его нет, устанавливать.

Код:
void logging(std::string& msg) 
{
     if (!isConnected())
             connectToLogServer();
     if (!isConnected())
          return;

      std::cout << msg;
 }

 И тогда выгода только в краткости синтаксиса. Но пропустим это Улыбающийся

Короче, хочет чел делать без возврата, та и пусть делает, видно для него это имеет смысл. Для меня не приобрел.

А сдругой стороны, кому в этом мире помешала проверка this на null? Да никому.

« Последнее редактирование: Декабрь 11, 2019, 21:39 от Azazello » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #48 : Декабрь 11, 2019, 21:39 »

Академичности ради, пример с void и реф-реф, действительно, плохой.

"Обычная" void функция обычно имеет сайд-эффект в том, что она меняет сам объект (например, void std::vector<T>::clear()). Иные сайд эффекты (как то изменение глобальных объектов) - это фу-фу-фу и всеми (справедливо) ругается.

В случае с void foo() && у функции (почти) нет никаких вариантов, кроме как изменить глобальный стейт (запись в лог - это пример такого изменения). Ведь делать что-то с объектом бессмысленно - он вот сейчас будет разрушен и никому (уже) не нужен. А изменение глобального стейта это фу-фу-фу и неакадемично.
« Последнее редактирование: Декабрь 11, 2019, 21:44 от Авварон » Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #49 : Декабрь 11, 2019, 21:46 »

Академичности ради, пример с void и реф-реф, действительно, плохой.

"Обычная" void функция обычно имеет сайд-эффект в том, что она меняет сам объект (например, void std::vector<T>::clear()). Иные сайд эффекты (как то изменение глобальных объектов) - это фу-фу-фу и всеми (справедливо) ругается.

В случае с void foo() && у функции (почти) нет никаких вариантов, кроме как изменить глобальный стейт (запись в лог - это пример такого изменения). Ведь делать что-то с объектом бессмысленно - он вот сейчас будет разрушен и никому (уже) не нужен. А изменение глобального стейта это фу-фу-фу и неакадемично.

От блядь. Ну понимашь, вылез в конце.
Я уже гармонию со всеми нашёл, а вы по второму кругу Улыбающийся

Ну так привидите пример, когда void && имеет смысл хоть какой. Я тему закрывал, что-бы холивар закрыть. А вы так ХРЯСЬ.

Академичность бывает разная, в зависимоти от курса, уровня заведения и т.д.
В одном случае рассказываем что от 3-5 не имеет смысла, в другом, что получится -2.

НО!, логгирование это и есть смысл глобальной переменной. Уж извените, вы не подумав сказали. QSettings вам в пример. У нас так всегда, начали за упокой, закончили глобальными переменными.
« Последнее редактирование: Декабрь 11, 2019, 21:59 от Azazello » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #50 : Декабрь 11, 2019, 21:54 »

От блядь. Ну понимашь, вылез в конце.
Я уже гармонию со всеми нашёл, а вы по второму кругу Улыбающийся

Ну так привидите пример, когда void && имеет смысл хоть какой. Я тему закрывал, что-бы холивар закрыть. А вы так ХРЯСЬ.

Я так-то с тобой согласен что пример изначальный говно=)
Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #51 : Декабрь 11, 2019, 22:28 »

Кстати, ssoft, отдельная благодарность за отзывчивость и понятность ваших объяснений. А также за труд, когда вы писали исходники.

И Igors, за отзывчивость и желание помогать.

Но господи! Перестаньте писать, в том, в чем вы не уверены!
Я думаю, что ответ на stackoverflow вы бы писали с тщательность в 10 раз больше.

Хорошо. Я уж вас точно не лечу, я вас подначиваю Улыбающийся

Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #52 : Январь 29, 2020, 12:00 »

Я понял, _Bers таки норкоман и не в курсе, чем отличается constexpr из с++11 от constexpr из с++14.

ты походу сам там чего то употребляешь.
иначе как ещё ты мог сделать такие выводы?

Вот уж не знаю, зачем сидеть на msvc2015, кроме как если у аффтора до сих пор Windows 2000. Ну или есть контра жмотится на новую лицензию.

судя по тупости вопроса, ты - не профессионал?

бизнес инертный.
он очень медленно модернизируется, и только при необходимости.

в любом случае компоненты должны собираться как старыми компиляторами, так и новыми.
поддержку старых сборок никто не отменял.

Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #53 : Январь 29, 2020, 12:08 »

Но, в свете вашего ответа, довольно развернутого и понятного, попрошу ещё и пункт 5 развенуть.
Боюсь я его тоже не правильно понял "из коробки"

сегодня виртуальные функции не могут быть шаблонными.

однако технически, ничто не мешает сделать поддержку шаблонных.
(с известными ограничениями)

Код:
struct base
{
    template<class t>
    virtual void foo(const t&) = 0;
};

struct der: base
{
    template<class t>
    virtual void foo(const t&) {}
   
};

struct some {};

int main()
{
    der d;
    base& b = d;
   
    some v;
    b.foo(v);
    // --- приводит к инстанцированию
    // virtual void base::foo(const some&) = 0;
    // virtual void der::foo(const some&){}   
    // и так для всех наследников
}



поддержка шаблоно-виртуальных функций позволит реализовать на с++ полноценную динамику
(динамические типы данных любой сложности. как в скриптовых языках)
без приседаний вокруг type erasure





Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #54 : Январь 29, 2020, 12:12 »

Ну только норкоман будет прелагать полечить "старый компилятор" введением фичи в новый стандарт.
Примерно похожая фича, кстати, обсуждается - constexpr!
Не очень, правда, ясно, как фича из 20го\23го стандарта решит проблему древнего msvc2015...

это был лишь пример пример ситуации,
где такая фича была бы очень кстати.

можно привести и другие примеры.

в стандарт, кстати, данную фичу таки утвердили:
https://en.cppreference.com/w/cpp/language/consteval

Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 23.