2010-12-09 4 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 где я храню константную ссылку на временную переменную и использовать его в 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(); 
Смежные вопросы