No właśnie nie do końca to rozumiem. Tym bardziej, że dla T = int
się kompiluje, ale dla innego dowolnego skalara, np. float czy long, już nie. Co więcej, wywalenie operator const T& () const
też eliminuje problem, więc mam wrażenie, że to tutaj się coś gryzie. No ale tam jest przecież zwracany const reference
, więc nie wiem z czym kompilator ma problem. Gdyby to była po prostu referencja, to wtedy T += 21
mogłoby zostać zinterpretowane dwojako:
- Skorzystaj z
const T& operator+=(const T& tValue)
.
- Skorzystaj z
operator const T& () const
, a potem na zwróconej przez tą funkcję wartości (Data = long)
, wykonaj wbudowaną operację +=.
No ale tutaj zwraca const
, więc opcja nr 2 odpada i nie powinno być niejednoznaczności...?
Da się to rozwiązać jakoś bez castowania? Potrzebuję jak najbardziej naturalnego wrappera na skalar, w którym mogę zarządzać tym, co się dzieje z danymi po ich nadpisaniu (chodzi o każdorazowe kopiowanie ich do wewnętrznego bufora). Chciałbym, żeby to funkcjonowało jak np. std::atomic
. Ostatecznie mogę zwracać kopię obiektu zamiast referencji, ale wolałbym tego uniknąć.