Может ли компилятор C ++ выполнить RVO для именованной переменной const, используемой для возвращаемого значения? - PullRequest
3 голосов
/ 18 мая 2019

Этот вопрос является небольшим вариантом для связанного вопроса , показанного здесь .

В C ++ 17 у меня есть локальная переменная, которую я хочу быть const, чтобы продемонстрировать, что она не изменена один разсоздано по Скотту Мейерсу Эффективная рекомендация C ++ по пункту 3 для по возможности использовать const :

#include <string>

std::string foo()
{
    const std::string str = "bar";

    return str;
}

int main()
{
    std::string txt = foo();
}

Может ли компилятор выполнить (именованную) оптимизацию возвращаемого значения для txt, хотя тип str отличается от типа возвращаемого значения foo из-за разницы в константности?

1 Ответ

3 голосов
/ 18 мая 2019

Именованная оптимизация возвращаемого значения включается разрешением копирования, указанным в C ++ 17 в [class.copy.elision] .Соответствующей частью здесь является [class.copy.elision] /1.1:

Когда определенные критерии выполнены, реализация может опустить конструкцию копирования / перемещения классаобъект, даже если конструктор, выбранный для операции копирования / перемещения и / или деструктор для объекта, имеет побочные эффекты.[…]

  • в операторе return в функции с типом возвращаемого класса, когда выражение является именем энергонезависимого автоматического объекта (кроме введенного параметра функции или переменной).с помощью объявления-исключения обработчика ([исключением. дескриптора])) с тем же типом (игнорируя квалификацию cv) в качестве типа возврата функции, операция копирования / перемещения может быть опущена путем создания автоматическогообъект непосредственно в объекте возврата вызова функции

[…]

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

Обратите внимание, что const, тем не менее, может быть проблематичным.Если компилятор не выполняет исключение копирования (это только разрешено, и не обязательно произойдет здесь; даже в C ++ 17, так как выражение в операторе return не является prvalue), const, как правило, предотвращает объект отвместо этого перемещается (обычно не может двигаться от const объекта)…

...