今天我在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中?
&
或*
并不与类型相关,而是与你所声明的对象相关联。例如,B virtual &fun()
是可以正常工作的。 - melpomene