首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc:无效错误“使用删除的功能”(复制构造函数)?

问gcc:无效错误“使用删除的功能”(复制构造函数)?
EN

Stack Overflow用户
提问于 2022-04-02 15:36:37
回答 1查看 320关注 0票数 1

简化问题:

代码语言:javascript
复制
#include <stdio.h>
class X
{
public:
    int a = 0;
    X() { printf("constr-def %d\n", a); }
    X(int i):a(i+1) { printf("constr-i %d\n", a); }
    int operator=(int i) { a = i; return i; }
    operator bool() { return !!a; }
    
    //~ X(const X& o) { a = o.a; printf("copy-constr %d\n", a); };
    //~ const X& operator=(const X& o) { a = o.a; printf("copy-op %d\n", a); return *this; };
    
    X(const X& o) = delete;
    const X& operator=(const X& o) = delete;
};

int main() {
    X x;
    X y = 5;  // should be equivalent to X y(5)
    printf("results: %d %d\n", x.a, y.a);
}

编译后的输出,如MSVC;或使用gcc / MSVC和未删除的复制构造函数变体活动(上面注释掉):

代码语言:javascript
复制
>g++ -Os dede.cpp -o dede
>dede
constr-def 0
constr-i 6
results: 0 6
>Exit code: 0

->复制构造函数从不使用;MSVC按原样成功编译。

按照gcc的方式编译(v9.3.0当前的mingw/msys64 64构建):

代码语言:javascript
复制
>g++ -Os dede.cpp -o dede
dede.cpp: In function 'int main()':
dede.cpp:20:8: error: use of deleted function 'X::X(const X&)'
   20 |  X y = 5;  // should be equivalent to X y(5)
      |        ^
dede.cpp:14:5: note: declared here
   14 |     X(const X& o) = delete;
      |     ^
dede.cpp:7:2: note:   after user-defined conversion: 'X::X(int)'
    7 |  X(int i):a(i+1) { printf("constr-i %d\n", a); }
      |  ^
>Exit code: 1

gcc为什么在未删除的情况下不使用use of deleted复制构造函数时出错?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-02 15:43:20

在C++17之前,这样的复制省略是一个优化,这是允许的,但是复制(或移动)构造函数仍然必须是存在和访问的。

由于C++17代码工作正常,因为对于强制复制选择,复制/移动构造函数不需要再次出现或访问。

C++17核心语言的prvalue和临时语言规范与早期的C++版本有着根本的不同:不再有临时的复制/迁移。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71718920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档