170 похожих чатов

Вопрос про передачу владения. Есть код: struct A {

N n;
A(N n): n(std::move(n)) {}
//A(N&& n): n(std::forward<N>(n)) {} // ambiguous
};

struct B {
N n;
//B(N n): n(std::move(n)) {} // ambiguous
B(const N& n): n(n) {}
B(N&& n): n(std::forward<N>(n)) {}
};

int main() {
N n;
A a(std::move(n));
B b(std::move(n));
}
Преимущества структуры А: единственный конструктор; недостатки: двойной вызов конструктора перемещения.
Преимущества структуры B: единственный вызов конструктора перемещения; недостатки: два конструктора.
Вопрос: можно ли объединить оба преимущества в одной структуре и, если да, то как? Принимать в конструктор структуры аргументы конструктора N и создавать на месте не предлагать. :)

22 ответов

19 просмотров

Можно поизвращаться с forward и SFINAE, но вопрос целесообразности очень остр

Alexander "Ternvein"-Isaev Автор вопроса
Dmitriy [Отпуск]
Можно поизвращаться с forward и SFINAE, но вопрос ...

Ну вот да, хотелось бы элегантное решение, так то вместо какой-то телеги на 3 листа проще 2 конструктора написать. Как ни странно, clang любит вариант 1.

Забей болт и пиши конструктор с приёмкой по значению, мув конструктор это ничто, свап указателей по сути

Alexander "Ternvein"-Isaev Автор вопроса
Kirill Bolshakov
Забей болт и пиши конструктор с приёмкой по значен...

Та я так и делал. Просто посетила мысль: вдруг можно лучше?

Alexander "Ternvein" Isaev
Та я так и делал. Просто посетила мысль: вдруг мож...

Лучше - один конструктор с forward ссылкой. Минус - неявные типы и необходимость писать тело в хэдере

Alexander "Ternvein"-Isaev Автор вопроса
Kirill Bolshakov
Лучше - один конструктор с forward ссылкой. Минус ...

Вот после этого и посетила как раз. :) Но это, понятное дело, разные вещи.

Alexander "Ternvein" Isaev
Та я так и делал. Просто посетила мысль: вдруг мож...

Общее решение — использование forward ссылок, пример на C++20: struct A { N n; template<typename T> requires std::same_as<N, std::remove_cvref_t<T>> A(T&& n): n(std::forward<T>(n)) {} }; На предыдущих стандартах понадобится использовать SFINAE для ограничения типов, впрочем, переписывается практически 1 в 1, но чуть более сложночитаемо

Artöm Bakri Al-Sarmini
template <utils::same_as_decayed<N> T> A::A(T&& t)...

Я подумал, что внесение дополнительных сущностей из utils в демонстрационном примере — плохая идея) Я бы имя упростил до like_as, кстати

Alexander "Ternvein"-Isaev Автор вопроса
Ofee Oficsu
Общее решение — использование forward ссылок, прим...

Про forward ссылки понятно. Вопрос именно для невыводимых типов.

Ofee Oficsu
Я подумал, что внесение дополнительных сущностей и...

Это так, вишенка. Я сначала хотел same_as втупую вместо typename поставить, но вывод параметра все портит

Alexander "Ternvein" Isaev
Про forward ссылки понятно. Вопрос именно для невы...

Я, кажется, не смог понять, какую проблему вы имеете ввиду под невыводимыми типами, можно немного подробнее?

Alexander "Ternvein"-Isaev Автор вопроса
Ofee Oficsu
Я, кажется, не смог понять, какую проблему вы имее...

То, что у меня не шаблон, а просто структура. А forward -- это только про выводимые типы.

Alexander "Ternvein" Isaev
То, что у меня не шаблон, а просто структура. А fo...

Последнее предложение для меня всё ещё остаётся неясным, если честно

Alexander "Ternvein"-Isaev Автор вопроса
Ofee Oficsu
Последнее предложение для меня всё ещё остаётся не...

А что именно не ясно? Что "универсальные" ссылки, за счёт которых это работает, существуют только в контексте выводимых типов?

Alexander "Ternvein" Isaev
А что именно не ясно? Что "универсальные" ссылки, ...

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

Alexander "Ternvein"-Isaev Автор вопроса
Ofee Oficsu
Я с трудом себе представляю семантику универсально...

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

Alexander "Ternvein" Isaev
Так вопрос же был не про универсальную передачу. Э...

У вас в самом начале такая постановка вопроса: >> Преимущества структуры А: единственный конструктор >> недостатки B: два конструктора >> можно ли объединить оба преимущества в одной структуре и, если да, то как Если под единственным конструктором понимать единственное тело, ваш вопрос уже семантически эквивалентен "можно ли обеспечить универсальную передачу?"

Alexander "Ternvein"-Isaev Автор вопроса
Ofee Oficsu
У вас в самом начале такая постановка вопроса: >>...

Нет, не эквивалентен. Один конструктор + одна операция перемещения это не то же самое, что универсальная передача. Хотя универсальная передача -- один из способов решения.

Alexander "Ternvein" Isaev
Нет, не эквивалентен. Один конструктор + одна опер...

Один конструктор + одна операция перемещения — это один move ctor и здесь совершенно не должно возникать каких-либо проблем: struct C { N n; C(N&& n) : n(std::move(n)) {} }; Конечно же, конструктор копирования станет недоступен в таком случае. Но в действительности, в вашем коде продемонстрировано, что вы ещё, дополнительно, хотите и copy ctor в структуре B, т.е. вам требуется именно универсальное решение

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта