non-const reference bound to temporary

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

non-const reference bound to temporary

OdgovorNapisal/-a Kroko » 27 Jun 2018, 13:25

Visual studio ima grdo "razširitev" in dovoljuje uporabo začasne nekonstantne reference:
Koda: Izberi vse
void List::AddString(const std::string& str)
{
  AddStream(istringstream(str));
}
void List::AddStream(std::istringstream& stream)
{
  /*...*/
}


Seveda je taka koda daleč od standardov in nikakor ni portabilna.

V VS2017 lahko prevajalniku vklopimo /permissive- kar ga naredi mnogo bolj skladnega s standardi. Zgornja koda seveda ne prevede več.
Rešitev je tole:
Koda: Izberi vse
[code]void List::AddString(const std::string& str)
{
  AddStream(*const_cast<std::istringstream*>(&std::istringstream(str)));
}
void List::AddStream(std::istringstream& stream)
{
  /*...*/
}
[/code]


Opazi kdo kakšne stranske efekte take rešitve?
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4809
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 687 krat
Prejel zahvalo: 1670 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: non-const reference bound to temporary

OdgovorNapisal/-a Kroko » 27 Jun 2018, 13:47

EDIT:
Čeprav v VS2017 deluje pa g++ tega vseeno ne prevede.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4809
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 687 krat
Prejel zahvalo: 1670 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: Yandex [Bot] in 1 gost