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>;
};
需要注意的是,如果您使用 final
或 override
,那么您已将它们放在 return 类型之后:
virtual auto fun3bc() const
-> B const*
final;
不过请记住,这样的编码约定(将 final
或 override
放在自己的行上)是非常不寻常的。仅仅因为 C++ 允许您使用它,它不一定是个好主意。
当我在 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>;
};
需要注意的是,如果您使用 final
或 override
,那么您已将它们放在 return 类型之后:
virtual auto fun3bc() const
-> B const*
final;
不过请记住,这样的编码约定(将 final
或 override
放在自己的行上)是非常不寻常的。仅仅因为 C++ 允许您使用它,它不一定是个好主意。