gpt4 book ai didi

C++ "virtual"关键字放置

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:57 26 4
gpt4 key购买 nike

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

最佳答案

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

#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++ 允许您使用它,就不一定是个好主意。

关于C++ "virtual"关键字放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43679147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com