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

elc*_*uco 8 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());
}
Run Code Online (Sandbox Code Playgroud)

汇编给了我:

$ 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.
Run Code Online (Sandbox Code Playgroud)

编辑:

使用const(如使用fooconst指针,并标记value()为const)会产生相同的错误.

Mat*_*Mat 9

Integer i(12);
foo(&i);
Run Code Online (Sandbox Code Playgroud)

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

显然,如果foo试图以这种或那种方式坚持这个指针,你就会遇到问题.

  • *你抓住一个非常可疑的临时地址.*不,它不是可疑的.行为定义明确,`12.2/3`*临时对象被破坏作为评估全表达的最后一步(词法上)包含创建它们的点*. (4认同)
  • @elcuco:`{Integer i(12); FOO(ⅰ); }` (2认同)
  • @elcuco:我的回答已经包含了.`{}`没有任何实际价值. (2认同)