Почему atomic_load с shared_ptr не компилируется с gcc 4.9?

Это не компилируется с использованием gcc 4.9.3 (из репозитория Docker):

#include <memory>
#include <atomic>

int main() {
    auto p = std::make_shared<int>(3);
    auto n = std::atomic_load(&p);
}

Чтобы протестировать с версией gcc docker (вы можете просто скопировать и вставить весь блок):

docker run -it gcc:4.9 bash
# create a test.cpp with previous code:
cat > test.cpp << EOF
#include <memory>
#include <atomic>

int main() {
 auto p = std::make_shared<int>(3);
 auto n = std::atomic_load(&p);
}

EOF
# and compile:
g++ -std=c++11 test.cpp -o bla

Не компилируется с 4.9, успешно с 5.1, хотя на странице совместимости C++0x/C++11 не упоминается о проблемах

Просто разместив это здесь, потому что я потерял несколько часов, чтобы выяснить проблему, поэтому больше никто не должен терять время на этом:)

Редактировать: добавить вывод компилятора:

test.cpp: In function 'int main()':
test.cpp:6:30: error: no matching function for call to 'atomic_load(std::shared_ptr<int>*)'
  auto n = std::atomic_load(&p);
                              ^
test.cpp:6:30: note: candidates are:
In file included from test.cpp:2:0:
/usr/local/include/c++/4.9.3/atomic:906:5: note: template<class _ITp> _ITp std::atomic_load(const std::atomic<_ITp>*)
     atomic_load(const atomic<_ITp>* __a) noexcept
     ^
/usr/local/include/c++/4.9.3/atomic:906:5: note:   template argument deduction/substitution failed:
test.cpp:6:30: note:   'std::shared_ptr<int>' is not derived from 'const std::atomic<_ITp>'
  auto n = std::atomic_load(&p);
                              ^
In file included from test.cpp:2:0:
/usr/local/include/c++/4.9.3/atomic:911:5: note: template<class _ITp> _ITp std::atomic_load(const volatile std::atomic<_ITp>*)
     atomic_load(const volatile atomic<_ITp>* __a) noexcept
     ^
/usr/local/include/c++/4.9.3/atomic:911:5: note:   template argument deduction/substitution failed:
test.cpp:6:30: note:   'std::shared_ptr<int>' is not derived from 'const volatile std::atomic<_ITp>'
  auto n = std::atomic_load(&p);
                              ^

1 ответ

Решение

Это было упущением в библиотеке libstdC++. Смотрите этот отчет об ошибке. О добавлении этой функции упоминается в примечаниях к выпуску GCC 5 в разделе "Библиотека времени выполнения". Он не отображается по вашей ссылке, потому что это библиотека, а не функция компилятора. Имеется страница, посвященная поддержке функций библиотеки, но, к сожалению, в ней не указано, в какой версии функция появилась впервые.

Другие вопросы по тегам