2016-08-20 22 views

回答

6

首先,"HelloWorld!"是一個左值。 (一個const char數組)。

但是您的代碼使用過載:

template< class T > 
T&& forward(typename std::remove_reference<T>::type&& t); 

A C字符串文字可以結合std::string&&,通過衰減到char const *並且被用來初始化一個臨時std::string

請注意,以後使用rstr將是未定義的行爲,因爲在語句結尾存在臨時停止。這個臨時對象不會延長到rstr的生命期,因爲rstr綁定到一個xvalue,但擴展只發生在引用綁定到prvalue時。

+1

'std :: string && rstr = ...'明確地擴展了臨時的生命週期,直到'rstr'超出範圍。 –

+0

@DanielSchepler它不!它必須*直接*綁定到臨時,在這裏不是這種情況。 – Quentin

+2

@DanielSchepler不,它不。在此代碼中,rstr綁定到一個xvalue。只有當引用綁定到一個prvalue時,纔會發生生存期延長。 –