【问题标题】:clang compiling to which version of c++ in macOS?clang 在 macOS 中编译到哪个版本的 c++?
【发布时间】: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++版本是什么?

【问题讨论】:

  • 您可以签到代码:stackoverflow.com/a/7132549/362589
  • 警告文本会很好。连同版本号。 clang 已经编译到 C++14 有一段时间了。我知道 macOS 隐藏了他们实际使用的版本,但我没有遇到过这种问题。
  • @sweenish,我已经更新了帖子。如果它正在编译为 c++14,我认为它不应该给出我在问题图片中显示的错误。
  • 值得一提的是,任何值得一提的项目都会指定 C++ 版本以避免这些确切的问题。依赖默认值只是玩具程序的一种选择。
  • @Dani,您的链接非常有帮助。我的 clang 正在编译的默认版本也是 c++98,并且 move() 函数也存在于 c++98 中,但显然它不执行移动语义,而只是进行深度复制。

标签: c++ c++11 clang++


【解决方案1】:

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 风格:

默认的 C++ 语言标准是 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

感谢STRICT_ANSI macro

所有 c* 和 gnu* 模式的区别:

c* 模式定义“STRICT_ANSI”。

(...)

【讨论】:

    【解决方案2】:

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

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

    https://stackoverflow.com/a/7132549/362589

    这里是 c++98 中 move() 答案的链接:

    https://stackoverflow.com/a/65010079/13023201

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2020-07-28
      • 2018-10-18
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 2018-05-12
      相关资源
      最近更新 更多