Почему 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 в разделе "Библиотека времени выполнения". Он не отображается по вашей ссылке, потому что это библиотека, а не функция компилятора. Имеется страница, посвященная поддержке функций библиотеки, но, к сожалению, в ней не указано, в какой версии функция появилась впервые.