C++ "virtual" 关键字放置

C++ "virtual" keyword placement

当我在 Visual Studio 2015 年的今天编写界面时,我注意到一些奇怪的行为。 "virtual" 关键字在函数标识符之前的位置通常无关紧要,但如果它放在指针或引用之后,它就会报错。请参阅以下内容:

class B {};

class A
{
    virtual B fun1a(); // OK
    B virtual fun1b(); // OK

    virtual B& fun2a(); // OK
    B& virtual fun2b(); // ERROR, "expected an identifier"

    virtual B* fun3a(); // OK
    B* virtual fun3b(); // ERROR, "expected an identifier"

    virtual std::unique_ptr<B> fun4a(); // OK
    std::unique_ptr<B> virtual fun4b(); // OK
};

这是为什么?

显然我可以通过始终将 virtual 关键字放在前面来完全避免错误,但我希望能够按以下方式编写函数定义:

foo const & // return value and relevant keywords on one line
virtual bar( const baz &a ) const // function identifier, arguments, and relevant keywords on another line
{
    /* method implementation */
}

唉,这对于返回引用或指针的函数来说是不可能的...

此语法错误是语言特定的还是 Visual Studio 本地化的?

试试这个

baz const // return value and relevant keywords on one line
virtual &foo::bar( arg a, arg b ) const // function identifier, arguments, and relevant keywords on another line
{
    /* method implementation */
}

您是否考虑过使用 尾随 return 类型?他们将允许您实现将 return 类型放在自己的行上的目标:

#include <memory>

class B {};

class A
{
    virtual auto fun1a()
    -> B;

    virtual auto fun1a() const
    -> B;

    virtual auto fun2a()
    -> B&;

    virtual auto fun2a() const
    -> B&;

    virtual auto fun2ac()
    -> B const&;

    virtual auto fun2ac() const
    -> B const&;

    virtual auto fun3b()
    -> B*;

    virtual auto fun3b() const
    -> B*;

    virtual auto fun3bc()
    -> B const*;

    virtual auto fun3bc() const
    -> B const*;

    virtual auto fun4a()
    -> std::unique_ptr<B>;

    virtual auto fun4a() const
    -> std::unique_ptr<B>;
};

需要注意的是,如果您使用 finaloverride,那么您已将它们放在 return 类型之后:

virtual auto fun3bc() const
-> B const*
final;

不过请记住,这样的编码约定(将 finaloverride 放在自己的行上)是非常不寻常的。仅仅因为 C++ 允许您使用它,它不一定是个好主意。