0iStalker
> Первые 2 варианта, как-то нехорошо пахнут ненужным копированием, на ровном
> месте... особенно, если конструктор копирования не определён явно.
Нет там ни копирования, ни присваивания. Это абсолютно синонимичные написания одного и того же (и я не говорю об оптимизациях, это на уровне языка так сделано). Можешь проверить.
Мне на ревью один умный коллега (без сарказма) это предъявил. А я порадовался, что знаю этот момент лучше него.
0iStalker
> Первые 2 варианта, как-то нехорошо пахнут ненужным копированием, на ровном
> месте...
А это как-то нехорошо пахнет незнанием синтаксиса c++
pahaa
> А это как-то нехорошо пахнет незнанием синтаксиса c++
>
>
Ой, ну всё...
Vlad2001_MFS
> Кто какой вариант выберет и почему?
кто-нить поясните за третий вариант! я не понимаю синтаксис
sf::Window window(sf::VideoMode( 640, 480), "Tittle", sf::Style::Default);
между sf::Window и window оператора не хватает?! или что вообще.
так:
sf::Window window(sf::VideoMode mode, string title, sf::Style style=sf::Style::Default);
?
первые два варианта плохие, потому что класс перегружен лишним конструктором.
он innuendo лучше вариант.
skalogryz
Третий вариант это
Class var(param1, param2);
т.е. объявление переменной совмещенное с конструктором.
kipar
> т.е. объявление переменной совмещенное с конструктором.
хм... глобальная переменная?! хм...
skalogryz
> хм... глобальная переменная?! хм...
https://en.cppreference.com/w/cpp/language/initialization
Vlad2001_MFS
> Кто какой вариант выберет и почему?
Вариант с auto.
Сразу видно объявление переменной + можно совмещать с возвращаемыми значениями/кастами + меньше табуляции если вдруг надо выровнять:
auto x = A(); auto y = f( ); auto z = static_cast<A>( B( )); auto wwww = new A( );
А кто против авто - тот обычный дикарь и вообще болен на С головного мозга.
Это в принципе неизлечимо, можно сразу предлагать выпить йаду.
Vlad2001_MFS
> Кто какой вариант выберет и почему?
вариант 2. потому что в первом варианте копирование кода, а в третьем — потенциальный https://en.wikipedia.org/wiki/Most_vexing_parse
Suslik
Тут явно не тот случай, ибо циферы в VideoMode избавляют от неоднозначности.
Есть код:
class Test { private: int* data; public: Test() noexcept { data = new int[10]; } ~Test( ) noexcept { delete[] data; } void Print( ) noexcept { printf( "0x%x\n", data); } };
Почему компилятор не ворнингует на кторе?
Ведь new может кинуть std::bad_alloc.
Какой тогда вообще толк от noexcept?
nes
> Какой тогда вообще толк от noexcept?
https://en.cppreference.com/w/cpp/language/noexcept_spec
Note that a noexcept specification on a function is not a compile-time check; it is merely a method for a programmer to inform the compiler whether or not a function should throw exceptions. The compiler can use this information to enable certain optimizations on non-throwing functions as well as enable the noexcept operator, which can check at compile time if a particular expression is declared to throw any exceptions. For example, containers such as std::vector will move their elements if the elements' move constructor is noexcept, and copy otherwise (unless the copy constructor is not accessible, but a potentially throwing move constructor is, in which case the strong exception guarantee is waived).
skalogryz
> он innuendo лучше вариант.
ну да, как эти товарищи будут юзать окно из разных участков кода
innuendo
> ну да, как эти товарищи будут юзать окно из разных участков кода
точно так же, только без говнокода с синглтонами
Suslik
> точно так же, только без говнокода с синглтонам
это типа чтобы только противоречить мне ? забавно