Я обновил свой набор инструментов C ++ из Visual Studio 2013 до Visual Studio 2017 / 2019.
Теперь у меня возникает ряд ошибок компиляции в виде:
<source>(13): error C2280: 'OfflineFixture::OfflineFixture(const OfflineFixture &)': attempting to reference a deleted function
<source>(8): note: compiler has generated 'OfflineFixture::OfflineFixture' here
<source>(8): note: 'OfflineFixture::OfflineFixture(const OfflineFixture &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'std::unique_ptr<int,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)'
Уникальный указательявляется членом класса, который не имеет конструктора и деструктора.В этом случае Visual Studio позволяет создать экземпляр объекта следующим образом:
OfflineFixture a{}; // works!
Но использование:
auto&& a = OfflineFixture{};
дает указанную выше ошибку компиляции.
const auto& a = OfflineFixture{};
также даетвыше ошибка компиляции.
Пожалуйста, посмотрите здесь: https://gcc.godbolt.org/z/XtP40t
Мой вопрос: мой код неверен?
Данные примеры компилируютсяиспользуя: gcc (9.1 и ниже) clang Visual Studio 2013
Но он не работает:
Visual Studio 2015
Visual Studio 2017
Visual Studio 2019
Один из способов исправить это - реализовать конструктор по умолчанию в OfflineFixture.
Минимальный пример:
#include <memory>
struct OfflineFixture
{
void x() const {}
int i;
std::unique_ptr<int> m_calc;
};
int test() {
#if 1
const auto&& a = OfflineFixture{};
#else
OfflineFixture a{};
#endif
a.x();
return 0;
}