Типы С++ && Литература об оптимизации С++

175
13 октября 2018, 18:50

Во-первых, можно ли как-нибудь узнать полное имя типа в с++? Я обычно использую typeid(...), однако в один момент это сыграло против меня, т.к. в подобном коде сравнение typeid показало true:

struct mystr{
    int value;
    mystr(const int value) : value(value){}
    mystr operator+(mystr& other) { return mystr(value + other.value); }
};
int main(){
    mystr var(6);
    ( typeid(mystr(6)) == typeid(var) ); // true        
    var+var;                             //корректно
    mystr(6)+mystr(6);                   //Error, нет оператора "+" для данных операндов
    return 0;
}

P.S. Как я понял, ошибка в том, что я передавал rvalue по ссылке, но почему так делать нельзя?

  1. Мы вроде не выходим из области видимости и в момент выполнения функции объект существует,
  2. а в стеке вроде тоже должна быть адресация?
  3. Да, мы создаем на стеке функцию(не уверен), которая находится поверх этого объекта,
  4. но объект мы никак не изменяем -> стек это не разрушит,
  5. или это просто базовый запрет?

Во-вторых, только учусь, но хочу заниматься openGL/Vulcan/OpenCL/CUDA - т.е. тем, что строится на оптимизации, поэтому хотелось бы узнать название каких либо современных книг(желательно на русском) об оптимизации и о том, что кроется за абстракцией С++.

Answer 1

У вас проблема в том, что вы пытаетесь сложить два rvalue, не имея для этого нужного метода. То есть ваш метод operator+ здесь не подходит, так как не может работать с rvalue. Чтобы это исправить либо сделайте так:

mystr operator+(mystr&& other) { return mystr(value + other.value); }

либо (что, ИМХО, гораздо лучше), добавьте константность:

mystr operator+(const mystr& other) const { return mystr(value + other.value); }

P. S. Вы в вопросе указали: «но объект мы никак не изменяем» — вы-то, может, знаете, что объект не меняется, вот только об этом нужно сказать компилятору.

READ ALSO
Как сделать долгое нажатие кнопки в android studio

Как сделать долгое нажатие кнопки в android studio

Всем приветТакая задача: нужно реализовать долгое нажатие кнопки

201
Возврат прежней точки карты в Google maps api

Возврат прежней точки карты в Google maps api

Имеется две активности: первая -карта, вторая - просто пустая активностьСценарий такой: покрутили, попередвигали карту (первая активность),...

123
Отчеты в JMeter

Отчеты в JMeter

Ребят, можете подсказать, если плагины/инструменты чтобы отчеты по JMeter более наглядно показывалисьВроде примерно разобрался как смотреть,...

147
Расчет цены при помощи SeekBar

Расчет цены при помощи SeekBar

У меня есть SeekBar , при скроллинге его значения умножается на 20000(мелочи расчетов), и сразу же отображается в другом блоке в виде ценыС Этим все...

138