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 ответов

6 просмотров

Можно поизвращаться с 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, т.е. вам требуется именно универсальное решение

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
Я хочу запустить свой проект в тг. Что-то между пирамидой и майнилкой. Еще подобного ничего не было. Уникальная идея. Нужен именно не бот, а приложение. С ввод, выводом тон...
Павел А.
6
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
How to create an OS in C? what to study?
Linus
18
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Реально в одиночку написать игровой движок на Си?
ㅤ (SVO)
11
Карта сайта