Подтвердить что ты не робот

Clang: не может быть передан в частную базу, пока существует общедоступное виртуальное наследование

Я пытаюсь скомпилировать следующий код (несколько минимальный пример), файл 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;
}
4b9b3361