Войти
ПрограммированиеФорумОбщее

C++ отложенное изменение свойств объекта в цепочке вызовов, независимо от порядка вызовов методов в цепочке (3 стр)

Страницы: 1 2 3
#30
13:20, 8 апр. 2019

1 frag / 2 deaths
Флаш стрима (которого лучше бы не было)

#31
13:21, 8 апр. 2019

Нет, ты не можешь гарнтировать, что компилятор сделает и как оптимизирует. Он может их даже местами поменять. Да и как будет работать что-то типа func(func1(), func2(), func3()); Порядок вызова не гарантирован никем.

#32
13:21, 8 апр. 2019

1 frag / 2 deaths
> ну по любому же он знает про смартпоинтеры

Ну тогда же ты должен знать и про то, что порядок вызовов деструкторов строго прописан и застандартизирован по самое небалуйся? Это heavy metal rules.

#33
13:21, 8 апр. 2019

1 frag / 2 deaths
> Точка вызова деструктора зависит даже от того, вернёт ли функция конст реф, или
> просто реф, как вообще на неё можно закладываться?

не очевидна ваша проблема.
приведите пример.

#34
13:27, 8 апр. 2019

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

обычно нет причин кидать исключения из деструктора.
а сама такая ситуация как правило - признак серьёзной проблемы в логике программы.

однако, если в каком то специфическом случае
вам так сильно захотелось бросить исключение из деструктора - ну так бросайте.

пример:
https://rextester.com/VWIQ78562

#include <iostream>

struct base
{
    // разрешаем деструктору кидать исключения
    ~base() noexcept(false) { throw 1; } 
};


struct test: base
{
    ~test() try
    {
        std::cout <<"ok\n";
    }
    catch(...)
    {
        std::cout << "test: exception\n";
    }
};

 
int main()
{
    std::cout << "Hello, world!\n";
    try
    {
        test t;
    }
    catch(...)
    {
        std::cout << "main: exception\n";
    }
}

output:

Hello, world!
ok
test: exception
main: exception

#35
(Правка: 13:30) 13:28, 8 апр. 2019

Тут всё просто - Страуструп сразу киллерфичей языка своего видел предсказуемый конструкторизм/деструкторизм (RAII) и всё чётко прописал.
Немного сломало строгие гарантие в определенных случаях позже желание всё-таки оптимизировать в случае с RVO. Вот тут могут быть отклонения от первичных стандартов поведения, но, замечу, что они не означают непредсказуемость деструкторов как таковых, но лишь сокращает количество существующих временных объектов, со всеми своими обязательными деструкторами.
Больше исключений не припомню навскидку.

#36
13:29, 8 апр. 2019

lookid
> Он может их даже местами поменять.

не может.
порядок вызовов строго стандартизирован.

компилятор может оптимизировать порядок вычисления аргументов для всей цепочки вызовов.
но не порядок самих вызовов функций этой цепочки.

#37
13:38, 8 апр. 2019

nes
> Ты наркоман, прочь от клавиатуры, иди мети дворы.

Реализуешь в своем движке такой подход с аккмулятором? Будет изюминка))
#38
13:42, 8 апр. 2019

Kartonagnick
> паттерн называется "атомарный стрим".
Спасибо, не знал. Век живи, век учись!

#39
13:52, 8 апр. 2019

Переименовал тему чтобы точнее отразить суть содержания. Норм?

#40
14:03, 8 апр. 2019

Оставлю ссылки, в терминологических целях:
https://en.wikipedia.org/wiki/Fluent_interface
https://en.wikipedia.org/wiki/Method_chaining

#41
(Правка: 14:26) 14:25, 8 апр. 2019

оставлю предостережение любителям цепочек вызовов.

следующий некорректный код написал Страуструп.
(Язык программирования C++, 4-е издание)

https://rextester.com/DILE27540

#include <iostream>
#include <cassert>
#include <string>

int main()
{

   std::string s = "but I have heard it works even if you don't believe in it" ;
   
   s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" )
       .replace( s.find( " don't" ), 6, "" );

   
   assert( s == "I have heard it works only if you believe in it" ) ;
}

http://qaru.site/questions/23071/does-this-code-from-the-c-progra… ined-behavior

[...] Этот код был рассмотрен экспертами C++ по всему миру и опубликован ([Язык программирования C++, 4- е издание). Тем не менее, его уязвимость к неопределенному порядку оценки была обнаружена только недавно инструмент[...]

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

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

#42
14:47, 8 апр. 2019

Kartonagnick
> http://qaru.site

Интересно почему гуглы с яндексами еще не забанили этот выпердыш, который переводит гугл-транслейтом stackoverflow и выдаёт эти переводы за свой контент. Глаза сломать можно читая.

Вот оригинал: https://stackoverflow.com/questions/27158812/does-this-code-from-… ion-36-3-6-ha

#43
19:20, 8 апр. 2019

Vitorio
Нет уж, увольте.

Страницы: 1 2 3
ПрограммированиеФорумОбщее