这是有效的C++吗?

lyr*_*cat 2 c++ compiler-construction standards

struct SomeStruct
{
  int a; 
  int b;
};

SomeStruct someFn( int init )
{
  SomeStruct ret = { init, init };
  //...
  return ret;
}

void someFn2( SomeStruct* pStruct )
{
  // ..
}

int main( )
{
  someFn2( &someFn(32) );
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 19

不,它无效.

从5.2.2/10 [expr.call]" 当且仅当结果类型是引用时,函数调用才是左值.

从5.3.1/2 [expr.unary.op]"操作数应为左值或限定id ".

someFn(32)因此,它不是一个左值,因为SomeStruct它不是一个引用,你使用它作为&需要左值的操作数.


Bri*_*ell 5

$ g++ -Wall -o stuct struct.cc 
struct.cc: In function ‘int main()’:
struct.cc:21: warning: taking address of temporary

你可能应该这样做:

int main( )
{
  SomeStruct s = someFn(32);
  someFn2(&s);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


246*_*tNt 5

不,这不对.

你只能在左值上使用&.SomeFn(32)不是左值.

你的主要应该是这样的:

int main( )
{
  SomeStruct s;
  s = someFn(32);
  someFn2(&s);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)