1

鉴于 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<...>;
^

您将在新语法中的何处放置覆盖?

4

1 回答 1

1

根据语法,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-seqopt组成。finaloverride

于 2013-09-17T23:02:13.580 回答