clang 在 macOS 中编译到哪个版本的 c++?

clang compiling to which version of c++ in macOS?

    #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

那么移动语义是如何工作的?

我知道我可以 select 我想使用 -std=c++xx 标志编译的特定版本的 c++,但这不是我想要的。

我想知道,clang 在 macOS 中编译成的默认 c++ 版本是什么?

我的 clang 正在编译的默认版本也是 c++98,c++98 中也存在 move() 函数,但显然它不执行移动语义(即创建右值引用),但只是深度复制。

以下 link 给出了找出编译器编译到哪个版本的 c++ 的答案:

这里是 link 对什么是 c++98 中的 move() 的回答:

clang 有一个选项可以指定您要使用的 C++ 版本:- std=xxx.

就像gcc一样,你可以索要ISO或GNU版本。例如:

c++98
c++03
ISO C++ 1998 with amendments
gnu++98
gnu++03
ISO C++ 1998 with amendments and GNU extensions

好像 clang 默认使用 GNU 风格:

The default C++ language standard is gnu++14.

gcc 也是如此。

您的编译器可能默认使用 gnu98,这意味着您的 C++ 版本确实是 C++98 (== C++03),但扩展提供了额外的功能,例如 std::move

你可以去compiler explorer and test the following code:

#include <iostream>

int main() {
    std::cout << __cplusplus;
}

使用 -std=gnu++98 使用 x86-64 clang 11.0.0 编译,程序输出:

199711

如果使用了 ISO 或 GNU 版本,你可以从你的代码中检查,感谢 STRICT_ANSI macro:

Differences between all c* and gnu* modes:

c* modes define “STRICT_ANSI”.

(...)