GCC 8 не может скомпилировать make_shared() - PullRequest
0 голосов
/ 11 сентября 2018

Этот код компилируется корректно и работает со всеми компиляторами, которые я пробовал, за исключением GCC 8 (и текущей магистрали GCC):

std::make_shared<volatile int>(0)

Я хотел бы знать:

  1. Правильно ли GCC 8 отказаться от этого кода?
  2. Есть ли замена, которую GCC 8 примет (с той же семантикой и производительностью)?Мне известно о std::atomic, но семантика не та, поэтому предложения использовать его вместо volatile не то, что я ищу.

Смотрите здесь: https://godbolt.org/z/rKy3od

1 Ответ

0 голосов
/ 11 сентября 2018

В соответствии со стандартным языком это несоответствие libstdc ++.

Это, вероятно, ошибка. make_shared вызывает allocate_shared со стандартным распределителем, std::allocator<remove_const_t<T>>, где T - это тип общего объекта. Этот распределитель будет использоваться только для получения переопределенного распределителя для базового общего объекта (структура, которая содержит переменные int и атомарные счетчики). Таким образом, совершенно нормально объявить этот базовый объект неконстантным и нестабильным.

Это определение для make_shared будет работать:

template<class T,class...Args>
auto make_shared(Args&&...args){
    using ncvT= std::remove_cv_t<T>;
    return std::allocate_shared<T>(std::allocator<ncvT>(),std::forward<Args>(args)...);
}
...