问题标签 [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.
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++ 中一个非常缺失的部分......
c++ - 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗?
最近,我遇到了这个答案,它描述了如何初始化std::array
非默认可构造元素。我并不感到惊讶,因为这个答案显然没有做任何默认构造。
相反,它std::array
使用聚合初始化构造一个临时变量,然后在函数返回时移动(如果移动构造函数可用)或复制到命名变量中。所以我们只需要移动构造函数或复制构造函数可用。
或者我是这么想的……
然后是这段让我感到困惑的代码:
所有五个特殊成员构造函数/运算符都被显式删除,所以现在我应该不能从返回值构造我的对象,对吗?
错误的。
令我惊讶的是,它在 gcc 中编译(使用 C++17)!
为什么会这样编译?foo
显然,要从函数中返回 a make_foo()
,我们必须构造 a foo
。这意味着在main()
函数中,我们foo
从返回的 中分配或构造 a foo
。这怎么可能?!
c++14 - 如何禁用实例化临时类?
我正在使用不应实例化以避免悬空引用的表达式模板类。但是我很想用 auto 声明一个变量,然后“auto”创建一个临时类的命名实例。
如何在以下代码中禁用临时类的自动声明?
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()
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 中编译,即使显然从未调用过移动构造函数?
c++ - C++11 删除/默认构造函数
我对如何/为什么在 C++11 和 C++17 中调用构造函数感到有点困惑。
因此,当我取消注释某些行组合(并使用c ++ 17标准标志与clang编译)时会发生什么,我感到困惑:
- 1、编译。列出 init 的 for
A
和A1
,以及默认的复制构造函数 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 编译失败。谁能解释编译器用来选择它将使用的构造函数的逻辑,以及为什么它无法编译?
如果我认为在其他情况下被调用的构造函数是错误的,你能否指出被调用的内容,为什么?
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
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;
c++ - 删除copy-ctor和copy-assignment - public、private还是protected?
为了使对象不可复制,我们可以显式删除其复制构造函数和复制赋值运算符。
public
我的问题是:在课堂的,private
或protected
部分中做这件事的正确位置是什么?而且 - 这个选择有什么不同吗?