Это действительный код C ++ в соответствии со стандартом?

StackOverflow https://stackoverflow.com/questions/4396549

Вопрос

У меня есть этот пример кода:

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 ?

Это было полезно?

Решение

Это не останется действительным. Временный объект будет уничтожен после инициализации a. Анкет В то время, когда вы звоните f Вы вызываете неопределенное поведение, позвонив test. Анкет Только следующее действительное:

// Valid - both temporary objects are alive until after the 
// full expression has been evaluated.
Test<>().f();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top