Во-первых, можно ли как-нибудь узнать полное имя типа в с++?
Я обычно использую 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 по ссылке, но почему так делать нельзя?
Во-вторых, только учусь, но хочу заниматься openGL/Vulcan/OpenCL/CUDA - т.е. тем, что строится на оптимизации, поэтому хотелось бы узнать название каких либо современных книг(желательно на русском) об оптимизации и о том, что кроется за абстракцией С++.
У вас проблема в том, что вы пытаетесь сложить два 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. Вы в вопросе указали: «но объект мы никак не изменяем» — вы-то, может, знаете, что объект не меняется, вот только об этом нужно сказать компилятору.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей