问题标签 [deleted-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
105 浏览

c++ - 转换运算符与已删除的构造函数

请看以下代码:

在这里,Y带有 an 的构造函数X被显式删除,而X有一个转换运算符 into Y。在这两个直接矛盾的地方,似乎=delete总是赢;我在一些最新版本的 GCC、Clang 和 VC++ 上进行了测试。

问题:这是“正确”的行为吗?我认为转换构造函数和转换运算符之间没有特别的优先级,所以上面的代码应该会产生重载解析歧义错误。但事实并非如此。它抱怨使用已删除功能。是因为保证复制省略吗?

我用谷歌搜索并找到Conversion constructor vs. conversion operator: priority。在那个问题中,选择了转换运算符,因为它是一个更好的匹配,因为存在const于转换构造函数中。但是,就我而言,更换Y(X&)Y(X const&)没有任何改变。


实际上,我想要的情况如下:

是的,有人可能会说这很傻,但确实有一些内置类型的行为就是这样:替代X <- int&Y <- int&&。无法创建完全模仿内置引用类型的用户定义类型似乎是当前 C++ 中一个非常缺失的部分......

0 投票
2 回答
1048 浏览

c++ - 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗?

最近,我遇到了这个答案,它描述了如何初始化std::array非默认可构造元素。我并不感到惊讶,因为这个答案显然没有做任何默认构造。

相反,它std::array使用聚合初始化构造一个临时变量,然后在函数返回时移动(如果移动构造函数可用)或复制到命名变量中。所以我们只需要移动构造函数或复制构造函数可用。

或者我是这么想的……

然后是这段让我感到困惑的代码:

所有五个特殊成员构造函数/运算符都被显式删除,所以现在我应该不能从返回值构造我的对象,对吗?

错误的。

令我惊讶的是,它在 gcc 中编译(使用 C++17)!

为什么会这样编译?foo显然,要从函数中返回 a make_foo(),我们必须构造 a foo。这意味着在main()函数中,我们foo从返回的 中分配或构造 a foo。这怎么可能?!

0 投票
2 回答
126 浏览

c++14 - 如何禁用实例化临时类?

我正在使用不应实例化以避免悬空引用的表达式模板类。但是我很想用 auto 声明一个变量,然后“auto”创建一个临时类的命名实例。

如何在以下代码中禁用临时类的自动声明?

0 投票
0 回答
88 浏览

c++ - 错误 'CDC::CDC(const CDC &)': 试图引用已删除的函数 MFCBreakout

在 MFC 中制作我的突破游戏。我将位图信息存储到一个CDC对象(设备上下文对象)中,但是由于每个块会有不同的位图,所以我将相同的覆盖存储CDC m_blockDC到 a 中std::vector<CDC> m_blockStates,并且由于我有五种块类型,我将前面提到的向量存储到 a 中std::vector<std::vector<CDC>>,所以我可以使用枚举BLOCKPROPS及其与索引相关的命中属性访问每个块状态位图信息;因此,我将访问每个块状态m_blockStates[BLOCKTYPE][CBlock.GetHits()]

当我尝试运行程序时'CDC::CDC(const CDC &)': attempting to reference a deleted function出现错误。

这就是我将 存储m_blockDC到二维向量中的方式:

这段代码用于OnInitDialog()of中,其中的CCreateWindow.cpp函数将用于绘制块,或者至少它应该是这样的。PaintBlock()OnTimer()

0 投票
1 回答
241 浏览

c++ - C++ Poco - 如何创建 NotificationQueue 的向量?

0 投票
2 回答
599 浏览

c++ - std::vector::push_back() 不能在 MSVC 上为具有已删除移动构造函数的对象编译

我有一个带有已删除移动构造函数的类,当我尝试在 MSVC(v.15.8.7 Visual C++ 2017)中调用 std::vector::push_back() 时,我收到一条错误消息,提示我正在尝试访问已删除的移动构造函数。但是,如果我定义了移动构造函数,则代码会编译,但永远不会调用移动构造函数。两个版本都可以在 gcc (v. 5.4) 上按预期编译和运行。

这是一个简化的示例:

在 Visual Studio 上编译时会出现以下错误:

但是,如果我定义移动构造函数而不是删除它

一切都编译并运行,输出如下:

正如预期的那样。不调用移动构造函数。(实时代码:https ://rextester.com/XWWA51341 )

此外,这两个版本都在 gcc 上运行良好。(实时代码:https ://rextester.com/FMQERO10656 )

所以我的问题是,为什么对不可移动对象的 std::vector::push_back() 调用不能在 MSVC 中编译,即使显然从未调用过移动构造函数?

0 投票
3 回答
205 浏览

c++ - C++11 删除/默认构造函数

我对如何/为什么在 C++11 和 C++17 中调用构造函数感到有点困惑。

因此,当我取消注释某些行组合(并使用c ++ 17标准标志与clang编译)时会发生什么,我感到困惑:

  • 1、编译。列出 init 的 forAA1,以及默认的复制构造函数 forA2
  • 2、编译。A和 list init (?) 的默认构造A1函数,以及 A2 的默认复制构造函数
  • 1 + 3 或 2 + 3,编译失败,因为删除了复制构造函数A2
  • 1 + 4,编译。A和 list init A1(?) 的默认构造函数,以及A2
  • 2 + 4,编译。A和 list init (?) 的默认构造A1函数,以及 A2 的默认复制构造函数
  • 1 + 5,编译失败。说A缺少(删除)默认构造函数,并且没有匹配的构造函数A1
  • 2 + 5,编译失败。没有匹配的构造函数A1

我想我了解其中的大部分内容,但我很困惑为什么 1 + 5 和 2 + 5 编译失败。谁能解释编译器用来选择它将使用的构造函数的逻辑,以及为什么它无法编译?

如果我认为在其他情况下被调用的构造函数是错误的,你能否指出被调用的内容,为什么?

0 投票
2 回答
200 浏览

c++ - 强制编译器在未使用基类删除的复制 ctor 定义的移动构造函数上发出错误

考虑一个防止复制构造和复制分配的基类,如下所示:

我们的开发人员现在可以包含这个类,并使用它来禁用继承类的复制,如下所示:

当我尝试使用CopyTest该类时:

或者

编译器发出错误:(use of deleted function xxx其中 xxx 是我删除的复制 ctor 或复制运算符)

然后,如果我想要std::move一个CopyTest对象:

编译器发出相同的错误(使用已删除的函数 xxx - 其中 xxx 仍然是我的复制 ctor 或赋值运算符)。

如果我提醒正确,那是因为开发人员没有定义正确的移动 ctor/赋值运算符。

是否可以强制编译器告诉CopyTest类的开发人员移动错误在这里,因为他没有定义正确的移动 ctor/赋值运算符,而不是因为复制 ctor/赋值运算符在基类上被删除?

平台 :

Debian 9

海合会 6.3.0

编译标志:

-fpermissive -ggdb -std=c++11

0 投票
3 回答
1735 浏览

c++ - 删除基类中的复制和移动构造函数/赋值运算符是否足够?

如果我有一个抽象基类,并且我想让所有派生类不可复制和不可移动,那么声明这些在基类中删除的特殊成员函数就足够了吗?我想确保我的整个类层次结构是不可复制和不可移动的,并且想知道是否可以不必在每个派生类中将这 4 个特殊成员函数声明为已删除。我看到了一个 SO 答案,它似乎暗示派生类可以显式声明复制或移动构造函数,尽管已从基类中删除,但是当我尝试定义默认的复制赋值运算符时,以下示例会导致编译错误,所以我我不确定。这是错误:

derived_class.cc:15:15:错误:默认此复制构造函数将在其第一次声明后将其删除 DerivedClass::DerivedClass(const DerivedClass &) = default;

derived_class.h:9:22:注意:“DerivedClass”的复制构造函数被隐式删除,因为基类“virtual_functions::BaseClass”有一个已删除的复制构造函数类 DerivedClass:public BaseClass {

base_class.h:11:3:注意:'BaseClass' 已在此处明确标记为已删除 BaseClass(const BaseClass &) = delete;

0 投票
5 回答
3529 浏览

c++ - 删除copy-ctor和copy-assignment - public、private还是protected?

为了使对象不可复制,我们可以显式删除其复制构造函数和复制赋值运算符。

public我的问题是:在课堂的,privateprotected部分中做这件事的正确位置是什么?而且 - 这个选择有什么不同吗?