【问题标题】:Is mixing the old and new C++ function syntax in a class allowed?是否允许在一个类中混合新旧 C++ 函数语法?
【发布时间】:2016-07-28 15:38:33
【问题描述】:

这段代码确实有效:

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

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

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

【问题讨论】:

  • 我假设Concrete 应该从Abstract 那里派生? (P.S:如果你想确保它实际上覆盖了基函数,请使用 override 关键字。如果编译失败,那么你就知道它们不匹配。)
  • 由于 c++ 是向后兼容的,它应该不是问题,如果需要它是另一个问题(样式指南)
  • @deW1 generally / mostly 向后兼容会更准确 ;-)
  • @Borgleader 显然。编辑以反映这一点。

标签: c++ c++14 auto


【解决方案1】:

右侧返回语法,通常有另一个目的,比如

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 没有在原型的左侧定义。

当返回类型被简单定义时,左右放置本质上是无关紧要的。

【讨论】:

    【解决方案2】:

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

    class Abstract {
        virtual auto foo() -> int = 0;
    };
    
    class Concrete: public Abstract {
        int foo() override { return 1; }
    } instance;
    
    int main() { }
    

    这里没有推导出返回类型,它是通过尾随返回类型显式声明的。
    相当于:

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

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

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

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

    【讨论】:

    • 原函数是纯虚函数为什么还要使用override?​​span>
    • @Philipp Override 明确地向读者说明了开发人员的意图。而且,如果基类中没有这样的虚函数,也会导致编译错误。为什么不呢?
    猜你喜欢
    • 2013-08-14
    • 2018-08-21
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多