Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';这个虚拟方法不能内联吗? 我读到,简单地说,如果C++编译器可以证明变量是某种类型的,它可以内联虚拟函数。为什么在这种情况下它不能这样做(使用MSVC 2017、clang 4.0、gcc 7.2和icc 17测试):_C++ - Fatal编程技术网

为什么可以';这个虚拟方法不能内联吗? 我读到,简单地说,如果C++编译器可以证明变量是某种类型的,它可以内联虚拟函数。为什么在这种情况下它不能这样做(使用MSVC 2017、clang 4.0、gcc 7.2和icc 17测试):

为什么可以';这个虚拟方法不能内联吗? 我读到,简单地说,如果C++编译器可以证明变量是某种类型的,它可以内联虚拟函数。为什么在这种情况下它不能这样做(使用MSVC 2017、clang 4.0、gcc 7.2和icc 17测试):,c++,C++,为什么会这样?为便于检查,请参见godbolt。尝试在虚拟函数声明末尾添加{} virtual int sq(int n) const {} 什么是“clang的优化视图”?@xaxxon我指的是优化输出。我会修好的。我不确定clang是否是编译器,但它毕竟是godbolt的一个特性。您可以在我提供的链接中看到它,单击“显示优化输出”。它显示了编译器试图优化代码的步骤。仔细看一下,我真的很惊讶它居然能工作caller正在切片一个Square,并且从来没有定义过Callable::sq(多态函

为什么会这样?为便于检查,请参见godbolt。

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

 virtual int sq(int n) const {}

什么是“clang的优化视图”?@xaxxon我指的是优化输出。我会修好的。我不确定clang是否是编译器,但它毕竟是godbolt的一个特性。您可以在我提供的链接中看到它,单击“显示优化输出”。它显示了编译器试图优化代码的步骤。仔细看一下,我真的很惊讶它居然能工作
caller
正在切片一个
Square
,并且从来没有定义过
Callable::sq
(多态函数调用需要通过指针/引用类型调用;完整对象类型(已切片)不会得到多态函数调用)。这可能是未定义的行为。@andre_ss6尝试将
sq
设为纯虚拟,您将看到您创建了
可调用的
实例。在第一个示例中调用
sq
时,被调用的方法是
Callable
定义,因为您没有
Square
的实例。在类型为
Callable
@andre\u ss6的变量中有效地分割
Square
实例。它无法内联调用,因为没有内联内容。您没有提供
可调用::sq
的定义。在第一个示例中调用的函数是
Callable::sq
,而不是
Square::sq
#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);
}
 virtual int sq(int n) const {}