Clang:在拥有公共虚拟继承的同时,无法投放私人基础

clang: cannot cast to private base while there is a public virtual inheritance

本文关键字:拥有 继承 虚拟 Clang      更新时间:2023-10-16

我正在尝试编译以下代码(有点最小的示例),文件 test.cpp

#include <iostream>
#include <memory> 
class Shared : public std::enable_shared_from_this<Shared>{
public:
    int prea;
};
class Widget : public virtual Shared{
    int a;
public:
    ~Widget(){
        a = 7;
    }
};
class Container : virtual public Widget{
};
class List : private Container, virtual public Widget{
public:
    int c;
};

int main(int argc, char** argv){
    auto c = std::make_shared<List>();
    c->c = 3;
    std::cout << c->c << std::endl;
    return 0;
}

使用clang++如下:

clang++ test.cpp -std=c++11

它给我以下错误:

/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/bits/shared_ptr_base.h:1106:50: error:
      cannot cast 'List' to its private base class 'const enable_shared_from_this<Shared>'
          __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
                                                        ^

请参阅此处的完整输出。

然后,如果我使用G 编译相同的代码,则没有错误,并且会产生可执行文件。我会说这是我期望的结果。不知道为什么clang 不喜欢代码。

那么,问题是谁是对的?clang++g++

编辑:即使在较小的示例中也可以复制:

#include <iostream>
#include <memory> 
struct Shared : public std::enable_shared_from_this<Shared>{
};
struct Container : virtual public Shared{
};
struct List : private Container, virtual public Shared {
};
int main(int argc, char** argv){
    auto c = std::make_shared<List>();
    return 0;
}

我在clang-3.4.1及以后都看到了对此的支持,以及GCC-4.7.1及以后。编译器Explorer中的示例