[является] компилятором [...] разрешено автоматически использовать конструктор перемещения
Да, было бы неплохо. Но это не только оптимизация, это реально влияет на язык.
Рассмотрим тип только для перемещения, такой как unique_ptr
:
std::unique_ptr<int> f()
{
std::unique_ptr<int> up;
return up; // this is ok although unique_ptr is non-copyable.
}
Предположим, ваше правило будет включено в стандарт C++, называемое правилом «последнего вхождения аргумента».
void SetString(std::unique_ptr<int> data)
{
m_data = data; // this must be ok because this is "argument's last occurence"
}
Проверить, используется ли идентификатор в возврате, легко. Проверка, является ли это «последним появлением аргумента», не является.
void SetString(std::unique_ptr<int> data)
{
if (condition) {
m_data = data; // this is argument's last occurence
} else {
data.foo();
m_data = data; // this is argument's last occurence too
}
// many lines of code without access to data
}
Это тоже допустимый код. Таким образом, каждый компилятор должен будет проверять «последнее вхождение аргумента», что не так просто. Для этого ему пришлось бы просмотреть всю функцию, чтобы решить, верна ли первая строка. Также трудно рассуждать как человек, если вам нужно прокрутить 2 страницы вниз, чтобы проверить это.
Нет, компилятору не разрешено в С++ 11. И он, вероятно, не будет разрешен в будущих стандартах, потому что эту функцию очень сложно реализовать в компиляторах вообще, и это просто удобство для пользователя.
person
ipc
schedule
21.03.2013