Терминология RVO типа
От: _NN_ www.nemerleweb.com
Дата: 10.04.19 21:08
Оценка:
Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ?
И как определить это через какой-нибудь type_traits ?

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

    X x2 ( move( makeX(i) ) ); // Error
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Терминология RVO типа
От: rg45 СССР  
Дата: 10.04.19 21:48
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ?


Я бы такой тип рассматривал как просто неперемещаемый. Ибо копируемый, но не перемещаемый — это какой-то нонсенс, имхо.

_NN>И как определить это через какой-нибудь type_traits ?


Да такие трейтсы и самому написать можно без особого труда.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Терминология RVO типа
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.04.19 22:53
Оценка:
Здравствуйте, _NN_, Вы писали:

твой пример несколько нереалистичен, ибо, как уже сказали ранее: копируемый, но не перемещаемый — это какой-то нонсенс
и, к тому же, наверное стОит принимать в расче и copy elision(https://en.cppreference.com/w/cpp/language/copy_elision)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Терминология RVO типа
От: _NN_ www.nemerleweb.com
Дата: 11.04.19 04:23
Оценка:
Здравствуйте, 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; // Не копируется
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Терминология RVO типа
От: _NN_ www.nemerleweb.com
Дата: 11.04.19 04:27
Оценка:
Здравствуйте, 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 и т.д.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Терминология RVO типа
От: rg45 СССР  
Дата: 11.04.19 05:11
Оценка: 8 (1)
Здравствуйте, _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"!
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 11.04.2019 9:40 rg45 . Предыдущая версия . Еще …
Отредактировано 11.04.2019 6:24 rg45 . Предыдущая версия .
Отредактировано 11.04.2019 6:17 rg45 . Предыдущая версия .
Отредактировано 11.04.2019 5:26 rg45 . Предыдущая версия .
Отредактировано 11.04.2019 5:17 rg45 . Предыдущая версия .
Re: Терминология RVO типа
От: rg45 СССР  
Дата: 11.04.19 05:49
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>И как определить это через какой-нибудь type_traits ?


А это уже дело техники:

https://ideone.com/bhVF9J

template <typename T, typename = T>
struct is_movable : std::false_type {};

template <typename T>
struct is_movable<T, decltype(T(std::declval<std::decay_t<T>>()))> : std::true_type {};


Похожим же образом реализуется и is_copyable.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Терминология RVO типа
От: _NN_ www.nemerleweb.com
Дата: 11.04.19 10:13
Оценка:
Здравствуйте, rg45, Вы писали:

R>P.P.S И еще, RVO и Guaranged copy elision ортогональны всем перечисленным комбинациям и действуют для всех типов. Поэтому на вопрос, "как лучше называть некопируемый_неперемещаемый_тип_для_которого_действует_RVO_и_guaranteed_copy_elision?" ответ подкупает своей простотой — просто "non-movable"!

Ну да, это применимо ко всем типам без разницы можно копировать/перемещать или нет.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Терминология RVO типа
От: Vamp Россия  
Дата: 11.04.19 12:19
Оценка:
_NN>А это уже ближе к вопросу о терминологии: is_copy_elisionable выглядит вполне хорошим названием.
Ты о чем? Не бывает типов, которые не могут быть copy elided.
Да здравствует мыло душистое и веревка пушистая.
Re: Терминология RVO типа
От: Vamp Россия  
Дата: 11.04.19 12:22
Оценка:
Здр
_NN>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO
Некопируемый и неперемещаемый тип. РВО компилятор имеет право (или обязан) применить независимо от наличия/осутствия конструкторов, разумеется при условии что код семантически корректен.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Терминология RVO типа
От: _NN_ www.nemerleweb.com
Дата: 11.04.19 13:31
Оценка:
Здравствуйте, Vamp, Вы писали:


_NN>>А это уже ближе к вопросу о терминологии: is_copy_elisionable выглядит вполне хорошим названием.

V>Ты о чем? Не бывает типов, которые не могут быть copy elided.
Действительно, я об этом потом подумал, но сообщение не удалил
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Терминология RVO типа
От: Erop Россия  
Дата: 17.04.19 12:16
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Как называется тип, который не перемещаем и не копируем, но к нему возможно применить RVO ?

Разве такой тип можно вернуть из функции?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Терминология RVO типа
От: _NN_ www.nemerleweb.com
Дата: 17.04.19 12:50
Оценка: 15 (1) +1
Здравствуйте, 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;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Терминология RVO типа
От: niXman Ниоткуда https://github.com/niXman
Дата: 17.04.19 12:53
Оценка: +1 :)
Здравствуйте, _NN_, Вы писали:

_NN>Начиная с C++17 можно.


Начиная с C++17 втой вопрос не актуален, но ты его все равно задал
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: Терминология RVO типа
От: _NN_ www.nemerleweb.com
Дата: 17.04.19 15:04
Оценка: :)
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, _NN_, Вы писали:


_NN>>Начиная с C++17 можно.


X>Начиная с C++17 втой вопрос не актуален, но ты его все равно задал

Бывает, что понимание сути приходит только после того сформулировал вопрос
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Терминология RVO типа
От: rg45 СССР  
Дата: 17.04.19 23:35
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>Разве такой тип можно вернуть из функции?


Да, Егор, не часто ты заглядываешь сюда последнее время. Вот и отстаешь от жизни.

https://jonasdevlieghere.com/guaranteed-copy-elision/
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.