C++"虚拟"关键字放置

Fal*_*ard 5 c++ syntax virtual syntax-error visual-studio-2015

当我今天在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
};
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

显然我可以通过始终将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 */
}
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*ckl 2

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

#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>;
};
Run Code Online (Sandbox Code Playgroud)

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

virtual auto fun3bc() const
-> B const*
final;
Run Code Online (Sandbox Code Playgroud)

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