为什么不能内联这个虚方法?

时间:2017-08-23 02:09:58

标签: c++

我读到,简单来说,如果C ++编译器可以证明变量属于某种类型,它可以内联虚函数。在这种情况下为什么不能这样做(使用MSVC 2017,clang 4.0,gcc 7.2和icc 17进行测试):

#include <iostream>

class Callable {
public:
    virtual int sq(int n) const;
};

class Square : public Callable {
public:
    inline int sq(int n) const override final  {
        return n*n;
    }
};

class Call {
public:    
    const Callable caller;
};

class Methods {
public:
    constexpr static const Call c {Square()};
};

int main() {
    using std::cout;
    cout << Methods().c.caller.sq(5);
}

我注意到godbolt中的clang优化输出(下面的链接)表示Callable::sq不会被内联,因为它的定义不可用。但是,Methods::cstaticconstCall::caller也是const。此外,Square::sqfinal。据我所知,他们无法在运行时改变。或者我错过了什么?

另一方面,编译器能够内联此版本中的函数:

#include <iostream>

class Callable {
public:
    virtual int sq(int n) const;
};

class Square : public Callable {
public:
    inline int sq(int n) const override final  {
        return n*n;
    }
};

class Call {
public:    
    Callable const* caller;
};

class Methods {
public:
    Call c {new Square()};
};

int main() {
    using std::cout;    
    cout << Methods().c.caller->sq(5);
}

为什么会这样? Link用于容易检查神童。

1 个答案:

答案 0 :(得分:0)

尝试在虚函数声明的末尾添加{}。

 virtual int sq(int n) const {}