Mam do czynienia z ostrzeżeniem GCC, które chcę naprawić. Zasadniczo przechodzę do metody wskaźnik do zmiennej lokalnej, co w moim przypadku jest całkowicie OK. Rozumiem, dlaczego kompilator mówi mi, że jest to potencjalny problem, ale w moim przypadku jest to w porządku.Podjęcie adresu tymczasowego - wymagane obejście
Jak mogę to obejść, na lokalnej przestrzeni? Przekazywanie -fpermissive
podczas kompilacji sprawi, że nie uda mi się znaleźć przyszłych problemów. Chcę rozwiązać ten konkretny problem lub obejść go.
Kod jest dostępny tutaj:
#include <cstdio>
class Integer{
public:
Integer(int i){ v = i; };
int value(){ return v; };
private:
int v;
};
int foo(Integer *i);
int main()
{
foo(&Integer(12));
}
int foo(Integer *i)
{
std::printf("Integer = %d\n", i->value());
}
i kompilacja daje mi:
$ g++ test-reference.cpp -O test-reference
test-reference.cpp: In function ‘int main()’:
test-reference.cpp:15:18: error: taking address of temporary [-fpermissive]
$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu3) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
EDIT:
Korzystanie const
(jak w podejmowaniu foo
wziąć const wskaźnik, a oznakowanie value()
jako const) daje ten sam błąd.
@jalf zobaczyć odpowiedź Mat, aby zrozumieć. W moim przypadku zmienna jest w zasięgu, gdy wywoływana jest funkcja. – elcuco
Nie możesz zmienić podpisu funkcji na 'int foo (const Integer & i);'? – jrok