2010-12-09 62 views
3

我有这样的示例代码:根据标准,这是有效的C++代码吗?

struct A 
{ 
    bool test() const 
    { 
     return false; 
    } 
}; 


template <typename T = A> 
class Test 
{ 
public: 
    Test(const T& t = T()) : t_(t){} 

    void f() 
    { 
     if(t_.test()) 
     { 
      //Do something 
     } 
    } 
private: 
    const T& t_; 
}; 

int main() 
{ 
    Test<> a; 
    a.f(); 
} 

基本上我担心的Test我在哪里存储const引用到一个临时变量和methof f使用它的构造。临时对象引用是否在f内保持有效?

+1

我认为 - 没有。编译器无法跟踪(通常情况下)引用的去向以及它是否持久存储。但最简单的是写一个示例应用程序,看看会发生什么。 – valdo 2010-12-09 09:21:40

+0

它适用于VS2008,但我不太相信它的权利。 – Naveen 2010-12-09 09:22:19

回答

7

它不会保持有效。临时对象在初始化a后将被销毁。当您拨打f时,您会致电test调用未定义的行为。只有以下有效:

// Valid - both temporary objects are alive until after the 
// full expression has been evaluated. 
Test<>().f();