首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这段代码可以在C++17下工作,而编译器却在使用C++11时抱怨?

这段代码可以在C++17下工作,而编译器在使用C++11时抱怨的原因可能是由于C++17引入了一些新的语法特性或标准库功能,而这些特性或功能在C++11中是不支持的。编译器在使用C++11时无法识别或解析这些新特性,因此会报错或警告。

要解决这个问题,可以尝试以下几个方案:

  1. 更新编译器版本:确保使用的编译器版本支持C++17标准,可以从编译器官方网站下载最新版本。
  2. 修改代码:将使用了C++17特性的代码修改为C++11兼容的写法,或者使用条件编译(如#ifdef)来根据编译器版本选择不同的代码分支。
  3. 使用编译选项:在编译命令中添加相应的选项,告诉编译器使用C++17标准进行编译。

需要注意的是,不同的编译器对C++标准的支持程度可能有所差异,因此在编写跨平台或可移植的代码时,建议遵循较低的C++标准,以确保代码在不同的编译器和环境中都能正常工作。

关于C++17的详细内容和特性,可以参考腾讯云的C++17介绍页面:C++17介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 实用指南

你刚刚学习了 C++11/14……现在你就需要更新 C++17 的知识,然后 C++20 就在路上了。三年并不是那么短的时间,但请记住,编译器一致性、公司政策、团队指南可能会以不同的节奏前进。...这个值可以 address 吗?可以复制吗?可以移动吗?应该移动吗?只有极少数情况,你才需要主动去澄清并充分理解它们。(模板化库编写、热路径等)。...使用你需要的东西 C++ 是一种多范式语言;你可以以多种不同的方式使用它。最近,我读到了一条有趣的评论,说 Cpp 程序员不接触模板元编程甚至异常等高级内容的情况,也能持续多年表现出色。...有时你会收到一些关于不推荐使用的内容或删除特性的警告(如 C++17 中的auto_ptr),但即使在这种情况,你也可以编译器切换到一些较旧的 C++ 标准。...采用 C++11/14/17/20 的新特性,你的方法是什么? 你使用 C++ 的主要问题是什么? 你在工作使用现代 C++ 吗?

52220

C++17常用新特性(五)---强制省略拷贝或传递未实质化的对象

C++17起,上面的代码可以编译通过了,因为C++17直接强制临时对象中强制省略了对象的拷贝。但是,C++17还不都彻底,当代码中包含一个具名的变量并作为返回值依然会调用拷贝构造函数。...很多主流的编译器在编译已经对代码进行了优化,但是这种优化一般根据具体的编译器而定,C++17后这种优化变成了一种标准。 可以返回不允许拷贝或者移动的对象。...泛型函数中使用了完美转发,具体可以参考下文: 【C++11】 改成程序性能的方法--完美转发 除此之外,C++17之后类中禁止移动构造函数的默认生成实际使用可以正常编译和运行,但是C++17之前是编译不过的...C++值类型体系可以分为三个阶段,分别是:C++11之前的值类型体系,C++11后到C++17期间的值类型体系以及C++17后的值类型体系。...prvalue已经不再是一个对象,而是一个可以进行初始化对象的表达式,因此使用prvalue初始化对象不需要进行拷贝而是可以进行移动的。这样确保了省略临时对象的拷贝操作可以完美实现。

1.3K20
  • 每个开发者都应该了解的一些C++特性

    auto 概念 当 C++11 第一次引入 auto,一切都变得更简单了。 auto 的概念是让 c++编译器在编译自动推断数据的类型,不是每次都要求你手动声明类型。...看一第五行。没有 initializer 你不能声明某些东西,这不难理解。像第五行这样,编译器是无法推断数据类型的。 最初,auto 的使用是非常受限的。之后的版本中,auto 变得更加强大!...第 7 和第 8 行中,我使用了花括号初始化。这个特性也是 C++11 中新加入的。 记住,当使用 auto ,必须确保你的编译器可以通过某种方式推断数据类型。...因此,如果你想在 lambda 函数中将数据转换成其他形式,你可以像下面这段代码一样,利用作用域来使用 lambda。 ?...多数情况,都是指针起反面作用。 幸运的是,C++11 引入了智能指针,它比之前的原始指针更加方便,可以通过适当地指针释放帮助开发者避免内存泄漏,同时也提供了额外的安全机制。

    76420

    C++17常用新特性(四)---聚合体扩展

    开头先看一段代码,然后可以思考需要怎么进行初始化。...stData={"Hello World",1}; 如果你使用的是C++11,那么可以这样进行初始化: DATA stData{"Hello World",1}; 从代码可以看出,C++11相对之前而言...其实,相对C++11而言,如果仅仅是对一个结构体而言,写法和C++11起的时候没有什么不同,但是有一点改进的是如果结构体是派生的,那么在对其子类进行初始化的时候也可以使用上面那种聚合体初始化的方法了,如下面这段代码...: [,0,0] [HelloWorld,0,0] [,0,10] [,0,0] 从代码代码运行结果可以看出,在对派生的聚合体进行初始化时,初始化的变量是可以跳过的,编译器会用默认值进行初始化。...定义方法和使用整体上是相同的。进行初始化时,变量成员的初始化也是按照定义基类的顺序进行初始化的。

    50330

    并发编程(从C++11C++17)

    并尽可能涉及C++11,C++14以及C++17中的主要内容。 为什么要并发编程 大型的软件项目常常包含非常多的任务需要处理。例如:对于大量数据的数据流处理,或者是包含复杂GUI界面的应用程序。...Clang版本要求如下: C++版本 Clang版本 C++11 3.3 C++14 3.4 C++17 5.0 默认情况编译器是以较低的标准来进行编译的,如果希望使用新的标准,你需要通过编译参数-...事实上,我们也不关心,因为只要有某个线程完成这个初始化工作可以了。 请思考一为什么要在main函数中创建once_flag flag。...不是直接返回。 条件变量提供了一个可以让多个线程间同步协作的功能。这对于生产者-消费者模型很有意义。在这个模型: •生产者和消费者共享一个工作区。这个区间的大小是有限的。...C++17 指示并行算法的执行可以并行化、向量化 注意:本文的前面已经提到,目前clang编译器还不支持这个功能。

    811130

    C++中auto关键字的用法详解

    C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导得。...return 0; } 所以auto无疑是十分不错的选择 5、autoC++14和C++17的更新 C++的auto关键字最初C++11中引入,主要用于自动类型推导,使编程更简洁。...这意味着你可以函数定义使用auto关键字指定返回类型,编译器会根据返回语句推导出具体的类型。这样做可以增加代码的可读性和灵活性,特别是模板编程和使用lambda表达式。...示例: struct Example { auto value = 42; // 自动推导为int }; 模板参数推导: C++17引入了模板参数推导,这意味着使用模板不再总是需要显式指定模板参数...对于函数模板,如果使用auto来指定参数类型,编译器可以根据传递的实参推导出模板参数类型。

    30210

    C++0x 通用属性

    不会返回的函数指的是被调处后面的代码不会执行,被调函数不会将控制流返回给主调函数,注意不是没有返回值的函数。通过这个属性,开发者可以告诉编译器进行代码优化,诸如死代码告警与消除等。...noreturn]] void abort(void) noexcept; 当然,[[noreturn]]可以帮助编译器进行代码优化,前提是正确使用。...如果开发平台是弱类型模型,并且很关心并行程序的执行性能可以考虑使用[[ carries_dependency ]]。...3.C++14与C++17通用属性 C++11的基础上,C++新标准C++14与C++17对通用属性进行了补充,主要有: (1)[[deprecated]]与[[deprecated(“reason”...示例: [[nodiscard]] int something() { return 1; } (4)[[maybe_unused]] 标准:C++17; 作用:抑制编译器使用实体上发出警告

    90520

    C++17中新特性

    C++17之前,我们定义全局变量, 总需要将变量定义cpp文件中,然后通过extern关键字来告诉编译器 这个变量已经在其他地方定义过了。...inline变量出现后,我们可以直接将全局变量定义头文件中,不用担心出现redefine的错误信息。 4....但是如果使用c++17的语法, if条件中初始化res,则代码就会显得更加简洁 // c++17 map c = {{1,"a"}}; if(auto res = c.insert...当我们通过函数创建一个对象,通常使用通过函数返回错误码,通过出参返回对象本身。...很多情况,我们只是临时处理字符串,本不需要对原始字符串的一份拷贝。 使用string_view可以减少不必要的内存拷贝,可以提高程序性能。

    4.9K30

    C++之Lambda研究

    前言 本文代码测试环境为“GCC-9.1.0”,有关编译器的安装请参考《安装GCC-8.3.0及其依赖》,适用于“GCC-9.1.0”。...Lambda代码段实际为一个编译器生成的类的“operator ()”函数,编译器会为每一个Lambda函数生成一个匿名的类(C++中,类和结构体实际一样,无本质区别,除了默认的访问控制)。...cpp:4:3: error: expected ',' or ';' before 'return' 4 |   return 0; |   ^~~~~~ Lambda之所以神奇,这得益于C++编译器工作...auto f = [&,*this]() mutable { foo(); }; f(); } }; int main() { X().xoo(); return 0; } 使用“*this”的...“f2 = f1;”将触发编译错误: int main() { auto f1 = []{}; auto f2 = f1; f2 = f1; return 0; } 上列代码C++11、C++14

    82120

    Modern C++,学炸了!!

    很多熟悉其他语言的同学看 C++ 的代码一般也能看的懂,然后找几个例子熟悉语法写了几行 C++ 代码,然后就产生了一个种错误:我也能写好 C++。...4.3 C++ 17 的改动 C++17 相对于 C++11 来说,是一个改动内容不多不少的版本: 一方面 C++17 进一步引入了一些新的语言特性,例如结构化绑定: //**结构化绑定**使用语法如下...虽然类型可以不一样,但这两种类型之间仍然要支持 operator != 操作。C++17 就 C++14 的这种改变,对旧的代码不会产生任何影响,但可以让后来的开发更加灵活。...各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一: 五、常用编译器C++11/14/17 的支持情况 我目前公司的项目也全部使用 C++17 开发,对于...C++17 的语法,美中不足的是这个库代码存在不少 bug,我项目中使用了它,但修改了其大量的 bug,有兴趣的朋友也可以下载下来看一:下载地址: https://github.com/uNetworking

    3.2K10

    C++17常用新特性(十)---模板特性:字符串变量当做模板参数

    C++的历次版本发布中,对C++模板参数的标准一直保持开放的态度,且对参数的要求也逐渐放宽。从C++17开始,非类型的模板参数也可以使用时定义了不必定义不同的作用域。...,如果编译没有注释: ExecptionMsg msgError; 编译将会报错,报错信息如下: 由此可见,非类型的模板参数中,字符变量是不能直接使用的,使用之前需要先进行定义...C++17除了继续遵守这个规范外,相对于之前的版本它允许实例化模板的作用域内声明,然后使用。不得不说也算是一种进步了吧。...但是从C++17开始,可以模板中使用一个返回指针的函数当做实参,如下面的代码C++17版本编译器可以通过: #include using namespace std; template...++14版本编译器中编译报错如下: 从报错信息可知,C++17以前的版本中,使用指针作为模板的实参需要对参数进行连接且不能将编译器内返回指针的函数模板实例化时进行使用

    1.7K30

    c++17好用的新特性总结

    C++1411的基础上查缺补漏,并未加入许多新特性,C++17作为C++11后的第一个大版本,标志着现代C++逐渐走向成熟。...有兴趣的朋友可以看看下面两篇文章: 《c++ inline variable 内联变量 c++17》 《GCC,Clang C模式,较低优化等级,链接器对内联函数报未定义错误,为什么?》...平时代码可以大规模使用的一个特性。其实对于string的争论一直没有停止过,很多人认为string是字节串不是字符串,因为string是可以改变的,这一切争论到C++17可以停止了。...通过使用std::variant,用户可以实现类似Rust的std::result,即在函数执行成功返回结果,失败返回错误信息,上文的例子则可以改成。...需要注意的是,c++17只提供了一个库级别的variant实现,没有对应的模式匹配(Pattern Matching)机制,最接近的std::visit又缺少编译器的优化支持,所以c++17中std

    3.3K10

    性能大杀器:c++中的copy elision

    ,输出: Default ctor Default ctor PS:本文中所使用编译器及版本为gcc 11.4.0,如果未做显式说明,在编译过程中都加上-std=c++11选项。...好了,仍然是上面的代码,如果编译选项变成-std=c++11 -fno-elide-constructors,输出试试,看看会是什么结果~~ emm,本地尝试编译并运行了: Default ctor...这意味着,当函数返回一个自动对象编译器可以优化掉不必要的拷贝或移动操作,直接将自动对象构造到函数调用的返回对象中,以提高效率。这种优化 C++ 标准中被明确规定,以支持更高效的代码生成。...现在,我们仔细回想前面的示例代码,在编译的时候,都加上了-std=c++11这个选项,这是因为笔者的gcc11.4默认情况是用的c++17c++17是能够保证RVO优化的,单独对NRVO则不能保证...如果使用g++ test.cc -o test编译并运行代码,输出: Default ctor Default ctor

    14910

    C++17常用新特性(八)---其他不常用语言特性

    =1, "表达式需要相等"); return 0; } 编译编译器报错类型为: C++17后,静态断言发布了新的版本,提示字符串可以进行省略。...从c++11开始,引入了花括号进行统一初始化,花括号前是否使用等号也代表着不同的含义,如下代码所示: int i{42};//整型变量 int i={42,24};//编译报错 auto i{42}...;//C++17前表示一个列表,C++17开始,表示初始化整型变量 auto i{42,34};//C++11表示整形列表,C++17开始,会报错, 从C++17开始,auto后面使用=号表示的是一个初始化列表...5 十六进制浮点数字面量 使用10进制数表示浮点数并不能准确的知道数据的保存精度,鉴于此,C++17中提供了16进制的浮点数字面量,可以帮助我们处理需要精确的浮点数的场景。...void fFunThrow(); void fFunNoexcept() noexcept; // 不 同 类 型 C++17可以通过同一个函数指针进行使用,但是之后,如果使用同一个函数指针分别指向这两个函数

    72720

    斩获 3.4k+ Star 的 C++ Insights:用编译器的视角看源码!

    C++ Insights 是一种基于 Clang 的工具,可进行源码到源码的转换,其目标是揭示通常情况编译器幕后为我们做的工作。它能帮我们看到编译器为了让代码正常运行进行的一些神奇操作。...2、为什么要做 C++ Insights? 2017 年,我开始研究 C++11、C++14 和 C++17 带来的一些新特性,如 lambda 表达式、基于范围的 for 循环和结构化绑定等。...请记住,C++ Insights 是基于 Clang 及其对 AST 的理解建立的。 3、如何构建? C++ Insights 可以 Clang 源代码树内部或外部进行构建。...--config Release --target install 你也可以 Visual Studio 中打开 build/LLVM.sln 解决方案,然后在其中构建所有内容,不是使用 cmake.../cppinsights 4、使用方法 使用 C++ Insights 非常简单: insights -- -std=c++17 当涉及到系统包含路径,情况就变得复杂了

    31710

    现代C++之如何返回一个对象?

    1.返回值优化(拷贝消除) 下面编译的gcc版本是支持c++17的gcc8.3。如果使用gcc5.5等版本结果会不同。... C++14 及之前确实是这样的。但从 C++17 开始,对于类似于 getA_unnamed这样的情况,即使对象不可拷贝、不可移动,这个对象仍然是可以被返回的!...2.总结 copy construct本身在RVO和NRVO两种情况被优化了,如果再加上move反而画蛇添足。... C++11 之前,返回一个本地对象意味着这个对象会被拷贝,除非编译器发现可以做返回值优化(named return value optimization,或 NRVO),能把对象直接构造到调用者的栈上...从 C++11 开始,返回值优化仍可以发生,但在没有返回值优化的情况编译器将试图把本地对象移动出去,不是拷贝出去。

    1.3K20

    关于编译的重要概念总结

    将函数库中相应的代码组合到目标文件中,汇编文件和系统库文件链接起来,生成特定平台可执行的程序。 最早的操作系统中,是没有链接器的,由加载器loader进行工作,所以ld的命名由此而来。...对于 .c和.cpp文件,g++则统一当做cpp文件编译 使用g++编译文件,g++会自动链接标准库STL,gcc不会自动链接STL gcc在编译C文件,可使用的预定义宏是比较少的...MinGW-w64 是开源软件,可以免费使用使用 Windows 的C语言运行库,因此编译出的程序不需要第三方 DLL ,可以直接在 Windows 运行。...进一步补充优化C++11。 C++ 17 到了2017年,C++迎来了C++17标准。此次对C++的改进和扩增,让C++变得更加容易接受和便于使用了。...而且Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作

    95420

    C++17, 语言核心层有哪些新的变化?

    看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一,这是第一篇~ C++11, C++14, 以及 C++17....我深入新标准的细节之前, 让我们先来总体浏览一C++17.(译注:作者的文章写于2017年初,当时C++17标准仍未正式发布) 让我们首先来看下C++标准整体的(特性)时间线....如果我们再结合使用C++17中新引入的结构化绑定声明(structured binding declaration),那么语法会更加优雅. structured binding declaration...< std::endl; return 0; } 22行和23行代码从C++第一个标准开始(C++98)便是合法的,但是25行及26行代码则只能在C++17中编译通过,因为C++17之前,你必须使用尖括号...+17 上述代码(第4行)与之前代码的一个细微差别是:C++17中,编译器仍然可以执行一次 myVal 的复制操作(也可以不执行复制),但第7行代码仍然保证不会发生复制操作.

    82820

    C++ 动态新闻推送 第10期

    https://sourceforge.net/p/cppcheck/news/2021/04/c17-support-in-cppcheck/ 文章 Throw,然后掉进二进制边界陷阱 讨论抛异常出二进制不同编译器的行为...可以扩展一眼界 c++ tip of week 223 Did you know about the proposal to add json support to the standard library...for C++ Developers 一本书,介绍simd,值得一看(我没看) How to Implement std::conjunction and std::disjunction in C+...+11 首先功能和可能的实现可以看这个链接 从c++17开始支持,链接里的可能的实现是递归方案,讨论非递归方案 看代码 template struct bool_pack{};...作者写了个论文,讨论了一种数学场景,费马数除法,如何除更高效 其实就是这段代码 // computes n % 274177 uint64_t div1(uint64_t n) { return

    48120

    可变参数和折叠表达式

    C++程序员肯定接触过可变参数,毕竟我们都用过printf,但是直到C++11C++才推出真正意义上的可变参数。...可变参数通过可变参数模板实现,C++11中通过递归调用,借助编译器生成多个递归的特化函数,调用时依次展开。C++17中引入折叠表达式,简化了可变参数的实现方式,但仍经由编译器生成了对应的特化函数。...注意事项 可变参数由于其可输入任意长度参数,方便了用户,但其也存在自身的劣势,所以使用时需要注意: 性能考量:采用递归展开模式编译器生成多个递归调用的模板特化函数,过度使用可变参数可能增加编译时间和代码体积...类型安全:C++强类型系统意味着可变参数模板使用时必须确保类型安全。 边界条件:设计可变参数函数,通常需要提供一个终止递归的边界条件。...由于多参数折叠表达式生成的模板特化函数的数量远少于递归生成的特化函数数量(5个参数的递归展开将产生5个模板特化,折叠表达式只有1个特化)同时编译器也基本都支持C++17了,建议使用折叠表达式的实现方式

    12010
    领券