gpt4 book ai didi

c++ - 当我不 move 任何东西时,为什么 clang 会提示已删除的 move ctor?

转载 作者:太空狗 更新时间:2023-10-29 20:08:58 24 4
gpt4 key购买 nike

前提:

#include <iostream>
using namespace std;

class ABC {
public:

ABC() {
cout << "Default constructor ..\n";
}

ABC(const ABC& a) {
cout << "In copy constrcutor ..\n";
}
ABC(ABC&& aa) = delete;
};

int main(int argc, char* argv[]) {
ABC b{ABC{}};
return 0;
}

用 GCC 和 Clang 编译这个

Clang - Apple LLVM 版本 8.1.0 (clang-802.0.42)

Gcc - 5.4.0 ubuntu

观察Clang 提示删除了 Move 构造函数。

Gcc 一点也不提示。并且会正确输出。

问题为什么?

对于 gcc,我知道如果您只是简单地同时初始化左值和右值,它会优化并且实际上不会调用复制构造函数并将临时值复制到左值。

为什么 Clang 不同?我认为(不确定,因此问题)这是 C++ 标准,哪个偏离(或不偏离)?还是我做错了什么。

编译命令:g++ --std=c++11 -O3 file.cpp

为了获得更多乐趣,请移除花括号并使用圆括号代替 ;)

ABC b{ABC{}}; to, ABC b(ABC());, 与本题无关。

编辑:有人将问题标记为重复问题,但事实并非如此。我明确表示我认为 C++11 标准包括复制省略。然而,CLANG 在像构造函数这样关键的东西上似乎没有相同的行为。

这是链接:http://en.cppreference.com/w/cpp/language/copy_elision

很明显,它说的是 C++11。我信任 cppref。

最佳答案

ABC{} 是临时的,因此 ABC b{ABC{}} 将使用 move 构造函数(即使可以省略)。

当 move 构造函数被删除时,您应该得到一个错误。

你的 gcc 版本有一个错误,并且没有通过错误的省略检测到错误。

在 C++17 中,通过保证复制省略,甚至可以省略已删除的构造函数。因此,您的代码将在 C++17 中编译,仅调用一个默认构造函数。

关于c++ - 当我不 move 任何东西时,为什么 clang 会提示已删除的 move ctor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50401409/

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