2015-10-12 13 views
-2

В соответствии с this присваивание не имеет перегрузки по r-значению. Вид функции подписи я ожидал это:Почему basic_string :: assign не имеет перегрузки r-значения?

basic_string::assign(basic_string::basic_string &&param); 

Я проверил реализацию MSVC-2014 и реализацию CGI, который не обеспечивает эту перегрузку. Очевидным преимуществом этого было бы в таких случаях, как

string final; 
while(true){ 
    string tmp; 
    // do some operation on tmp 
    if (ConditionSatisfied){ 
     final.assign(move(tmp)); 
     break; 
    } 
}  
// do further operations on final 

Это потому, что случаи использования этого были бы редкими? Или есть какой-либо недостаток дизайна, который включает перегрузку.

+0

Вы можете просто 'final = std :: move (temp);'. – Lingxi

+0

Как сказал Cubbi на cppreference: существует 'basic_string & assign (basic_string && str);' – dyp

ответ

1

В этот же странице вы связаны действительно показывает перегрузку, которую вы ищете:

basic_string& assign(basic_string&& str); 

4) Заменяет содержимое с теми ул используя перемещение семантику. str находится в неопределенном состоянии после операции.

Во-вторых, ваше утверждение о том, что оно не реализовано в MSVC (начиная с 2013 года), сомнительно, учитывая, что оно задокументировано на MSDN.

basic_string(
    basic_string&& _Right 
); 

Там нет Visual Studio 2014, существует, однако "14" CTP, который не предназначен для производственных сред. Visual Studio 2015 - версия 14.0. Фактический номер компилятора - 19.00.