C ++“虚拟”关键字放置

时间:2017-04-28 11:29:17

标签: c++ visual-studio-2015 syntax syntax-error virtual

当我今天在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本地化?

2 个答案:

答案 0 :(得分: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>;
};

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

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

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

答案 1 :(得分:1)

试试这个

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 */
}