Принимая адрес временного решения, необходимого
я сталкиваюсь с предупреждением GCC, которое я хочу исправить. В основном я передаю методу указатель на локальную переменную, что в моем случае совершенно нормально. Я понимаю, почему компилятор говорит мне, что это потенциальная проблема, но в моем случае это нормально.
как я могу обойти это, на локальном пространстве? Проходя -fpermissive
при компиляции я не смогу найти будущие проблемы. Я хочу исправить эту конкретную проблему или обойти ее.
код доступен здесь:
#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 = %dn", i->value());
}
и компиляция дает мне:
$ 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:
используя const
(как в принятии foo
возьмите указатель const и отметьте value()
as const) дает ту же ошибку.
3 ответов
Integer i(12);
foo(&i);
это избавляет от" взятия адреса временной " проблемы, которая у вас есть. Вы не передаете адрес локальной переменной (что выше, и действительно хорошо в этом случае), вы хватаете адрес временного.
очевидно, что если foo
пытается удержать этот указатель так или иначе, у вас будут проблемы вниз по линии.
GCC ошибочен в этом случае. Ваше целое число является rvalue и получение адреса rvalue является незаконным.
§5.3.1 унарные операторы, раздел 3
результат унарного оператора & является указатель на операнд. Этот операнд должен быть lvalue или квалифицированным id.
Clang дает ошибку в этом случае:
error: taking the address of a temporary object of type 'Integer' [-Waddress-of-temporary]
foo( &Integer(12) );
^~~~~~~~~~~~
template<typename T> const T* rvalue_address(const T& in) {
return ∈
}
на мой взгляд, это должно быть так же законно, чтобы взять const T*
как const T&
, но эта тривиальная функция будет легко выполнять преобразование.