Подтвердить что ты не робот

Является ли новый синтаксис возврата С++ ограниченным?

Я начал новый частный проект и решил использовать больше С++ 11/14 в этот раз. Поэтому я также начал использовать новый синтаксис возврата

auto functionName() -> returnType;

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

virtual const char* what() const noexcept override;

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

4b9b3361

Ответ 1

Да, это не то, что вы обычно предполагаете.

virtual auto what() const noexcept -> const char * override;

Это только то, что вам нужно использовать. Возможно, синтаксис был другим, но это то, что у нас есть.

Ответ 2

Причина проблемы заключается в том, что noexcept является частью декларатора функции (и предлагается быть частью типа функции в С++ 17), а override - это (необязательно используемый) идентификатор, который не является часть декларатора функций.

Следовательно, без использования override объявление будет

virtual auto what() const noexcept -> const char *;

и, поскольку override должен появиться после этого объявления, это приведет к

virtual auto what() const noexcept -> const char * override;

Тем не менее, вместо того, чтобы рабски использовать возможности С++ 11/С++ 14, выберите те, которые наилучшим образом отражают ваши намерения. Существует не какое-то правило, которое требует использования только функций С++ 11/С++ 14, если есть более старые альтернативы для достижения того же самого.

Ответ 3

Новый синтаксис поддерживает все, что делает старый синтаксис.

virtual const char* what() const noexcept override;

необходимо переписать как

virtual auto what() const noexcept -> const char * override;

На самом деле новый синтаксис поддерживает еще больше возможностей:

  • Это позволяет вам выполнять decltype аргументы функции.

    template <typename A, typename B> auto plus(A a, B b) -> decltype(a+b)
    {
        return A + B;
    }
    
  • Он также позволяет делать decltype на this, что, в свою очередь, позволяет вам выполнять decltype функции-члены. Смотрите это.

    struct S
    {
        int a() {return 1;}
        auto b() -> decltype(a()) {return 2;} // Works.
        decltype(a()) c() {return 2;} // ERROR.
    };
    

Но в то время как новый синтаксис имеет все эти дополнительные функции, он не должен заменять старый. По крайней мере, так я понимаю.

Некоторые программисты предпочитают использовать его, но насколько я знаю большинство программистов здесь, в Qaru предпочитают использовать старый синтаксис, когда это возможно.

Ответ 4

Так как вы спросили о С++ 14, для вашего сценария это лучше, чем синтаксис типа возвращаемого суффикса;

virtual auto what() const noexcept override;