是否允许在 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()->int
和 int 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);
因为 a
和 b
没有在原型的左侧定义。
当 return 类型被简单地定义时,左或右放置基本上是无关紧要的。
此代码实际有效:
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()->int
和 int 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);
因为 a
和 b
没有在原型的左侧定义。
当 return 类型被简单地定义时,左或右放置基本上是无关紧要的。