我读到,简单来说,如果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::c
是static
和const
。 Call::caller
也是const
。此外,Square::sq
是final
。据我所知,他们无法在运行时改变。或者我错过了什么?
另一方面,编译器能够内联此版本中的函数:
#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用于容易检查神童。
答案 0 :(得分:0)
尝试在虚函数声明的末尾添加{}。
virtual int sq(int n) const {}