C/C++

Компилятор ворует rvalue конструктор!

Пишу свою библиотеку и начал писать тесты под класс который написал. И тут замечаю, что в одном тесте конструктор rvalue просто не вызывается. Причём, конструктор вообще не вызывается, никакой. Компилятор - новый Гарри Потер и начал колдовать над конструкторами! Написал пример кода, который воспроизводит эту проблему (visual studio 2019)
 #include  

using namespace std;

class myclass
{
public:
myclass(size_t mys) : f(mys) { cout
обычно rval вызывается, когда переменная передается из другой области видимости, тоесть сразу после принятия - должна быть уничтожена. Чтобы повторить это здесь, можно заставить переменную уничтожится до выхода из зоны видимости.
const myclass f = move(myclass(11)).

Если переменная не имеет имени, это не значит что она временая. Она честно создается и отслуживает до конца действия main где была создана.

чтобы было видно конструктор от 11 - сделайте принимаемый парметр const int&.
Есть еще такая штука как оптизация. Которая улучшает код. И вместо ожидаемого
const myclass f = myclass(11);
делает
const myclass f (11);
АЮ
Андрей Юшкин
51 416
Лучший ответ
Василий Черепанов Да, спасибо. Как оказалось - компилятор просто выкидывает myclass(11) и делает сразу const myclass f(11). Это видно в дизассемблерном коде.
 #include  

using namespace std;

struct Any {
int x;
int y;
Any() : x(0), y(0) {}
Any(const int x, const int y) : x(x), y(y) {}
private:
friend ostream& operatory = test.p_any->y;
}
Test(Test&& test) noexcept : p_any(new Any) {
puts("Test(Test&&)");
this->p_any = move(test.p_any);
test.p_any = nullptr;
}
~Test() {
puts("~Test()");
if (p_any != nullptr) {
delete p_any;
p_any = nullptr;
}
}
Test& operator=(const Test& test) {
puts("Test& operator=(const Test&)");
if (this != &test) {
this->p_any->x = test.p_any->x;
this->p_any->y = test.p_any->y;
}
return *this;
}
Test& operator=(Test&& test) noexcept {
puts("Test& operator=(Test&&)");
this->p_any = move(test.p_any);
test.p_any = nullptr;
return *this;
}
private:
Any* p_any;
friend ostream& operator
Василий Черепанов Дак мне не это немного было нужно. С std::move то всё работает. Это и понятно - тут я прямо говорю использовать rvalue. Как оказалось - компилятор просто выкидывает myclass(11) и делает сразу const myclass f(11). Это видно в дизассемблерном коде
https://en.cppreference.com/w/cpp/language/copy_elision
"Mandatory elision of copy/move operations"
Мелис Исраилов
Мелис Исраилов
36 952
Владимир Силаев Спасибо что напомнили про Эллизию
я в какойто момент понял мув-семантику а щас опять забыл,
вроде как он вместо конструктора перемещает обьект в рвалью, если я правильно помню конструктор копирования в втоем случае вызывается а перемещения нет
.
Владимир Силаев Насколько я помню, это делается компилятором по соображениям производительности.

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