Ответ 1
Да, это не то, что вы обычно предполагаете.
virtual auto what() const noexcept -> const char * override;
Это только то, что вам нужно использовать. Возможно, синтаксис был другим, но это то, что у нас есть.
Я начал новый частный проект и решил использовать больше С++ 11/14 в этот раз. Поэтому я также начал использовать новый синтаксис возврата
auto functionName() -> returnType;
Он работает по большей части очень хорошо, но теперь мне нужна некоторая обработка ошибок и не удалось выяснить, как переписать такие вещи следующим образом:
virtual const char* what() const noexcept override;
с новым синтаксисом. Есть ли случаи, когда новый синтаксис не может быть использован, или я недостаточно умен, чтобы найти правильный порядок? Для меня важно, чтобы все было согласовано, поэтому я надеюсь, что проблема больше на моей стороне.
Да, это не то, что вы обычно предполагаете.
virtual auto what() const noexcept -> const char * override;
Это только то, что вам нужно использовать. Возможно, синтаксис был другим, но это то, что у нас есть.
Причина проблемы заключается в том, что noexcept
является частью декларатора функции (и предлагается быть частью типа функции в С++ 17), а override
- это (необязательно используемый) идентификатор, который не является часть декларатора функций.
Следовательно, без использования override
объявление будет
virtual auto what() const noexcept -> const char *;
и, поскольку override
должен появиться после этого объявления, это приведет к
virtual auto what() const noexcept -> const char * override;
Тем не менее, вместо того, чтобы рабски использовать возможности С++ 11/С++ 14, выберите те, которые наилучшим образом отражают ваши намерения. Существует не какое-то правило, которое требует использования только функций С++ 11/С++ 14, если есть более старые альтернативы для достижения того же самого.
Новый синтаксис поддерживает все, что делает старый синтаксис.
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 предпочитают использовать старый синтаксис, когда это возможно.
Так как вы спросили о С++ 14, для вашего сценария это лучше, чем синтаксис типа возвращаемого суффикса;
virtual auto what() const noexcept override;