Здравствуйте, Erop, Вы писали:
E>Здравствуйте, _NN_, Вы писали:
_NN>>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ? E>Разве такой тип можно вернуть из функции?
Начиная с C++17 можно.
Тип не материализуется до последнего момента.
Поэтому можно писать:
#include <iostream>
using namespace std;
struct a {
a(a const&)=delete;
a& operator=(a const&)=delete;
a(a&&)=delete;
a&& operator=(a&&)=delete;
};
a f() { return a{}; }
a g() { return f(); }
a h() { return g(); }
int main() {
auto x = h();
return 0;
}
Здравствуйте, _NN_, Вы писали:
_NN>>>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ?
R>>Я бы такой тип рассматривал как просто неперемещаемый. Ибо копируемый, но не перемещаемый — это какой-то нонсенс, имхо.
_NN>Копируемый ?
Я имел в виду, что в нормальных земных условиях существует три вида классов: 1) копируемый и перемещаемый; 2) перемещаемый, но не копируемый; 3) не копируемый и не преремещаемый. Четвертая комбинация — копируемый, но не перемещаемый — это какой-то очень специальный случай, который даже не стоит учитывать при проработке общих правил. Прошу заметить, говоря "неперемещаемый" я имею в виду такой, где попытка создать объект по prvalue или xvalue вырыжению приводит к ошибке компиляции — прошу не путать со случаем, когда вместо конструктора перемещения потихоньку вызывается конструктор копирования!
В соответствии с вышесказанным, сам для себя, я перечисленные три вида классов обозначаю как: 1) копируемый (copyable); 2) некопируемый (noncopyable); 3) неперемещаемый (nonmovable).
P.S. Короче говоря, если тип неперемещаемый, это автоматически означает, что он также и некопируемый и нет нужнды говорить об этом явно.
P.P.S И еще, RVO и Guaranged copy elision ортогональны всем перечисленным комбинациям и действуют для всех типов. Поэтому на вопрос, "как лучше называть некопируемый_неперемещаемый_тип_для_которого_действует_RVO_и_guaranteed_copy_elision?" ответ подкупает своей простотой — просто "non-movable"!
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, _NN_, Вы писали:
_NN>>Начиная с C++17 можно.
X>Начиная с C++17 втой вопрос не актуален, но ты его все равно задал
Бывает, что понимание сути приходит только после того сформулировал вопрос
Здравствуйте, _NN_, Вы писали:
_NN>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ?
Я бы такой тип рассматривал как просто неперемещаемый. Ибо копируемый, но не перемещаемый — это какой-то нонсенс, имхо.
_NN>И как определить это через какой-нибудь type_traits ?
Да такие трейтсы и самому написать можно без особого труда.
твой пример несколько нереалистичен, ибо, как уже сказали ранее: копируемый, но не перемещаемый — это какой-то нонсенс
и, к тому же, наверное стОит принимать в расче и copy elision(https://en.cppreference.com/w/cpp/language/copy_elision)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ?
R>Я бы такой тип рассматривал как просто неперемещаемый. Ибо копируемый, но не перемещаемый — это какой-то нонсенс, имхо.
Копируемый ?
struct X
{
X(int& a):a(a){}
X(X const&)=delete;
int& a;
};
X makeX(int& i) { return X(i); }
void test()
{
int i;
X x = makeX(i); // OK, RVO
X x2(x); // Не копируется
X x3(i);
x3 = x; // Не копируется
}
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, _NN_, Вы писали:
X>твой пример несколько нереалистичен, ибо, как уже сказали ранее: копируемый, но не перемещаемый — это какой-то нонсенс
Он не копируемый и не перемещаемый.
X>и, к тому же, наверное стОит принимать в расче и copy elision(https://en.cppreference.com/w/cpp/language/copy_elision)
А это уже ближе к вопросу о терминологии: is_copy_elisionable выглядит вполне хорошим названием.
Такой тип будет со значением is_copy_elisionable_v == 1, и значением 0 в is_move_constructible_v, is_move_assignable_v, is_copy_assignable_v и т.д.
Здравствуйте, rg45, Вы писали:
R>P.P.S И еще, RVO и Guaranged copy elision ортогональны всем перечисленным комбинациям и действуют для всех типов. Поэтому на вопрос, "как лучше называть некопируемый_неперемещаемый_тип_для_которого_действует_RVO_и_guaranteed_copy_elision?" ответ подкупает своей простотой — просто "non-movable"!
Ну да, это применимо ко всем типам без разницы можно копировать/перемещать или нет.
_NN>А это уже ближе к вопросу о терминологии: is_copy_elisionable выглядит вполне хорошим названием.
Ты о чем? Не бывает типов, которые не могут быть copy elided.
Здр _NN>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO
Некопируемый и неперемещаемый тип. РВО компилятор имеет право (или обязан) применить независимо от наличия/осутствия конструкторов, разумеется при условии что код семантически корректен.
_NN>>А это уже ближе к вопросу о терминологии: is_copy_elisionable выглядит вполне хорошим названием. V>Ты о чем? Не бывает типов, которые не могут быть copy elided.
Действительно, я об этом потом подумал, но сообщение не удалил
Здравствуйте, _NN_, Вы писали:
_NN>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ?
Разве такой тип можно вернуть из функции?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском