gpt4 book ai didi

c++ - 基类中的唯一指针禁止实例化,错误为 "attempting to reference a deleted function"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:43 24 4
gpt4 key购买 nike

我将我的 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 及更低版本)铛 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;
}

最佳答案

让我们在这里提出一些初步的观点。

一般来说,声明:

const auto&& a = Foo{};

C++ 中是完全合法的。此外,它是未定义的行为。事实上,这是 Reference Initialization 的完美示例具有临时生命周期的延长。

Whenever a reference is bound to a temporary or to a subobject thereof, the lifetime of the temporary is extended to match the lifetime of the reference [...].

它继续有一些异常(我不会引用所有异常),但是新对象的声明不是这些异常的一部分。


关于你的类(class),问题似乎很明显是 std::unique_ptr 成员。

这里是一个最小的例子:

#include <memory>

struct OfflineFixture {
std::unique_ptr<int> m_calc;
};

void test() {
const auto&& a = OfflineFixture{}; // <--- Error in msvc
}

不知何故,MSVC 尝试创建对象的拷贝。实际上,错误是关于调用复制构造函数(由于std::unique_ptr 而被删除)。

由于不应在此处执行任何复制,因此它似乎是一个 msvc 错误。

注意:gccclang 可以很好地编译。

关于c++ - 基类中的唯一指针禁止实例化,错误为 "attempting to reference a deleted function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56867422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com