使用新的函数声明语法进行重写

override with new function declaration syntax

本文关键字:语法 重写 声明 函数      更新时间:2023-10-16

鉴于 C++11 中引入的新函数声明语法,很容易从以下位置转换成员函数:

std::unique_ptr<...> operator()() const;

auto operator()() const -> std::unique_ptr<...>;

我相信要添加覆盖到第一个,您需要写:

std::uniqe_ptr<...> operator()() const override;

当我写:

auto operator()() const -> std::unique_ptr<...> override;

Clang给出了错误:

error: type-id cannot have a name
auto operator()() const -> std::unique_ptr<...> override
                                                ^~~~~~~~

当我写:

auto operator()() const override -> std::unique_ptr<...>;

Clang给出了错误:

error: 'auto' return without trailing return type
auto operator()() const override -> std::unique_ptr<...>;
^

你会在新语法中在哪里放置覆盖?

根据语法,override 关键字应该在尾随返回类型之后,即使用

auto operator()() -> std::unique_ptr<int> override;

使用最近的 gcc 快照尝试它有效,而即使是最新版本的 clang 也会失败。我会说这是 clang 实现中的一个错误。

该标准的相关引用是 8.4.1 [dcl.fct.def.general] 第 1 段:

函数定义具有以下形式

function-definition:
    attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt   function-body
function-body:
    ctor-initializeropt compound-statement
function-try-block
= default ;
= delete ;

virt-specifier-seqoptfinal和/或override组成。