2017-02-19 34 views
0

编译如下:警告:当地的临时对象返回引用

namespace platform { 
    struct event {}; 
    struct keyboard_event : public event {}; 

    const platform::event& wait_event() 
    { 
    return platform::keyboard_event(); 
    } 
} 

int main(int argc, const char* argv[]) 
{ 
    const platform::event& event = platform::wait_event(); 
    return 0; 
} 

产生具有铛以下警告

main.cc:7:12: warning: returning reference to local temporary object [-Wreturn-stack-address] 
    return platform::keyboard_event(); 
      ^~~~~~~~~~~~~~~~~~~~~~~~~~ 

然而,返回一个const引用的东西延长其使用寿命不就?

当前草案未加载用于我所以我会引用cppreference.com代替:

临时对象的寿命可以通过结合到一个const左值参考或到一个rvalue参考被扩展(自C++ 11以来),请参阅参考初始化以了解详细信息。

我怎样才能重新写这个有相同的效果,但避免警告?

+0

'platform :: keyboard_event()'是r值。你用'const&'绑定它并返回它。但是你不能返回temp或const的引用。这是经典的“返回临时参考”警告。 – xinaiz

+0

如果您按照“请参阅参考初始化中的详细信息”中的链接,cppreference继续说“在返回语句中函数的返回值的临时绑定不会被延长” – Cubbi

回答

2

不,“返回参考”不会奇迹般延长任何生命。

该寿命延长的唯一时间是当prvalue被绑定到一个参考可变,并且prvalue的寿命延长到该变量的:

struct Foo{}; 

{ 
    const auto & r = Foo{}; // Foo object not destroyed at semicolon... 
    // ... 
} 
// ... but is destroyed only here. 

你prvalue没有结合到任何变量,因此没有延长寿命。 (也请注意,非静态类数据成员不会被视为这个考虑因素的“变量”,所以如果您的类碰巧有参考成员,您也不能通过构造函数初始化程序列表来延长生命期。)

+0

好吧,然后粉笔以确保它可以处理未定义的行为/运气,堆栈没有改变。因此,在任何情况下,通过const l-value或r-value引用延长寿命都不能用于通过引用返回? –

+0

@CasperBeyer不,只返回值 - 这种情况下罚款 –

+0

在这种情况下返回值将导致切片,否? (假设每个结构有不同的数据集) –

相关问题