【发布时间】:2020-11-25 15:17:54
【问题描述】:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
vector<int> a;
a.push_back(3);
vector<int> b = move(a);
}
据我所知,“移动语义”是 c++11 的一部分
输出(当使用没有任何标志的 clang++ 命令编译时): C++98
那么移动语义是如何工作的??
我知道我可以使用 -std=c++xx 标志选择我想编译到的特定 c++ 版本,但这不是我想要的。
我想知道,在macOS中clang编译成的默认c++版本是什么?
【问题讨论】:
-
警告文本会很好。连同版本号。 clang 已经编译到 C++14 有一段时间了。我知道 macOS 隐藏了他们实际使用的版本,但我没有遇到过这种问题。
-
@sweenish,我已经更新了帖子。如果它正在编译为 c++14,我认为它不应该给出我在问题图片中显示的错误。
-
值得一提的是,任何值得一提的项目都会指定 C++ 版本以避免这些确切的问题。依赖默认值只是玩具程序的一种选择。
-
@Dani,您的链接非常有帮助。我的 clang 正在编译的默认版本也是 c++98,并且 move() 函数也存在于 c++98 中,但显然它不执行移动语义,而只是进行深度复制。