是否允许在 class 中混合使用新旧 C++ 函数语法?

Is mixing the old and new C++ function syntax in a class allowed?

此代码实际有效:

class Abstract {
    virtual auto foo() -> int = 0;
};

class Concrete: public Abstract {
    int foo() { cout << "blah!" << endl; return 1; }
} instance;

我知道函数被破坏并链接为相同的函数签名,但这种混合在 C++14 中真的合法吗?

这是合法的,因为实际上您已经完全定义了您的功能。
作为一个最小的工作示例(注意 override):

class Abstract {
    virtual auto foo() -> int = 0;
};

class Concrete: public Abstract {
    int foo() override { return 1; }
} instance;

int main() { }

此处未推导出 return 类型,它是通过尾随 return 类型显式声明的。
相当于:

class Abstract {
    virtual int foo() = 0;
};

如果你使用这个会有所不同:

class Abstract {
    virtual auto foo() = 0;
};

这里涉及模板推导,虚函数不能推导return类型(这或多或少是来自 GCC 的错误字符串)。

auto foo()->intint foo() 是用不同语法表达的相同原型,因此第二个函数是第一个函数的重写,并且将像往常一样在运行时调度(虚拟)中替换它。

右边的return语法,通常有另一个目的,比如

template<class A, class B>
auto some_combination(A a, B b) -> decltype(a+b);

否则需要更复杂的语法,如

temlate<class A, class B>
decltype(std::declval<A>()+std::declval<B>()) some_combination(A a,B b);

因为 ab 没有在原型的左侧定义。

当 return 类型被简单地定义时,左或右放置基本上是无关紧要的。