Компилятор C++17 (gcc или Microsoft Visual C++), имеет ли он параметр, запрещающий функцию «не создавать временный»

Как я могу сказать компилятору С ++ 17 создать временное устройство в следующем случае (т.е. компилятор C ++ 17 должен учитывать операцию копирования / перемещения, как это делают компиляторы C ++ 11 и C ++ 14)

      class A{
    public:
        A(){}
        A(const A&)=delete;
        A(A&&)=delete;
};
A f(){
    return A();
}
int main(){
    auto a=f();
}

Вывод (c ++ 14 - это то, что я хочу):

      gcc -std=c++14 ./a.cpp
./a.cpp: In function ‘A f()’:
./a.cpp:8:11: error: use of deleted function ‘A::A(A&&)’
  return A();
           ^
./a.cpp:5:3: note: declared here
   A(A&&)=delete;
   ^
./a.cpp: In function ‘int main()’:
./a.cpp:11:11: error: use of deleted function ‘A::A(A&&)’
  auto a=f();
           ^
./a.cpp:5:3: note: declared here
   A(A&&)=delete;
   ^

Выход (c ++ 17):

      gcc -std=c++17 ./a.cpp
./a.out

(successfully run)

У моего клиента есть тонна кода C ++ 11 и компиляторов C ++ 17: gcc 8.3.0 и компиляторы Microsoft C ++ (из Visual Studio 2017 и 2019). И есть много мест, где есть приведенный выше код. Есть ли у компилятора C ++ 17 параметр, запрещающий функцию «не создавать временное» в таком случае?

1 ответ

Решение

Вы не можете (и не должны) деактивировать гарантированное исключение. Однако, если вы хотите предотвратить это в конкретном случае, все, что вам нужно сделать, это не использовать prvalue:

      A f(){
    A a{};
    return a;
}

Для этого потребуется A можно переместить, хотя ход можно (и почти наверняка) все же пропустить.

Одним из основных моментов гарантированного исключения является то, что теперь вы можете возвращать prvalue неподвижного типа. Это позволяет выполнять более сложную инициализацию с помощью заводских функций. Это не вещь , которую вы должны хотеть , чтобы предотвратить в глобальном масштабе.

Другие вопросы по тегам