采取临时的解决方案 - 需要解决方法

时间:2012-04-01 08:34:59

标签: c++ gcc pass-by-reference

我正面临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 = %d\n", 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.

编辑:

使用const(如使foo采用const指针,并将value()标记为const)会产生相同的错误。

3 个答案:

答案 0 :(得分:9)

Integer i(12);
foo(&i);

摆脱了“取一个临时的地址”问题,这就是你所拥有的。你没有传递一个局部变量的地址(上面做了,在这种情况下确实没问题),你抓住了一个临时变量的地址。

显然,如果foo试图以这种或那种方式抓住那个指针,那么你就会遇到问题。

答案 1 :(得分:4)

template<typename T> const T* rvalue_address(const T& in) {
    return &in;
}

在我看来,将const T*作为const T&同样合法,但这个简单的功能会轻松执行转换。

答案 2 :(得分:4)

GCC在这种情况下是错误的。你的整数是一个右值,并且取一个右值的地址是非法的。

  

§5.3.1一元运算符,第3节

     

一元&amp;的结果operator是指向其操作数的指针。该   操作数应为左值或合格标识。

Clang在这种情况下出错:

error: taking the address of a temporary object of type 'Integer' [-Waddress-of-temporary]
    foo( &Integer(12) );
         ^~~~~~~~~~~~