草庐IT

c++ - 左值引用对象 : Clang and gcc disagree 上的 Constexpr 成员函数

当类具有constexpr成员函数并且该成员函数正在constexpr上下文中的左值对象上求值时,clang和gcc不同意结果是否为constexpr值。为什么?是否有既不需要默认可构造性也不需要复制可构造性的解决方法?当对象按值传递时,两个编译器都编译成功。Clang版本trunk、8、7:static_assert表达式不是整数常量表达式和Gcc版本trunk、8.1、7.4:编译没有错误#includeusingA=std::array;voidfoo(constA&a){//clang:static_assertexpressionisnotanintegralconstant

c++ - C 和 C++ 中的堆数组对齐以简化编译器 (GCC) 向量化

我目前正在为std::vector编写一个包装器容器模板类,它会自动为其std中的元素创建一个多分辨率金字塔::vector。现在的关键问题是我希望金字塔的创建是(GCC)可自动矢量化。所有存储在std::vector和我的分辨率金字塔中的数据数组都是使用标准的new或分配器模板参数在堆上创建的。有没有办法我可以帮助编译器强制对我的数据进行特定对齐,以便矢量化可以以最佳对齐方式(通常为16)对元素(数组)(block)进行操作。因此,我正在使用自定义分配器AlignmentAllocator但GCC自动矢量化消息输出仍然声明unalignedstd中的内存::mr_vector::co

c++ - Lambda 语法或 gcc 错误的最后一刻更改?

我使用gcc-4.7.0的svn版本来检查一些C++11特性,例如lambda表达式。几个星期以来,我的一些旧示例(包括Lambda)不再编译。我想知道:我是否错过了过去几周在gcc-4.7.0中实现的C++11-Lambda规范的最后一刻更改?它是否是gcc中的错误,它不再识别inline-Lambdas?还是我对Lambda语法有其他误解?有问题的代码似乎涉及直接作为参数提供的内联Lambda。你会说下面的代码是正确的C++11代码吗?#includeusingnamespacestd;structImage{};//dummyvoidfill(intcolor,constImag

c++ - 为什么这个 constexpr 代码会导致 GCC 吃掉我所有的 RAM?

以下程序将调用fun2^(MAXD+1)次。不过,最大递归深度永远不应超过MAXD(如果我的想法是正确的话)。因此编译可能需要一些时间,但它不应该占用我的RAM。#includeconstintMAXD=20;constexprintfun(intx,intdepth=0){returndepth==MAXD?x:fun(fun(x+1,depth+1)+1,depth+1);}intmain(){constexprinti=fun(1);std::cout问题是吃我的RAM正是它所做的。当我将MAXD调至30时,我的笔记本电脑在GCC4.7.2快速分配3GB左右后开始交换。我还没有尝

c++ - 如何特别为特定模块指定 gcc 标志 (CXXFLAGS)?

我最近正在构建一个新的NS3模块。在我的代码中,我使用了C++11(c++0x)的一些新特性,我想添加一个gccflags(CXXFLAGS)"-std=c++0x"到waf配置系统。我尝试这样做:CXXFLAGS="-std=c++0x"wafconfigure,然后构建它。然而,事实证明,一些现有的模块,如ipv4-address与c++11不兼容。因此,我想特别为我的新模块指定这个标志,这样其他模块就不会在c++11上被编译。我试图将它添加到我的新模块中的wscript:defconfigure(conf):conf.env.append_value('CXXFLAGS','-s

c++ - GCC 6.3.0 中的 ODR 违规,类型定义在两个单独的翻译单元中

我们在GCC中看到了以下代码示例中的一些奇怪行为。奇怪的行为是GCC6.3.0中的ODR违规,类型定义在两个单独的翻译单元中。可能与递归类型定义或类型不完整有关。我们不确定我们的代码是否有效,或者我们是否以递归定义类型的方式依赖于未定义的行为。请查看类变体动态类模板是如何在两个单独的cpp文件中定义和实例化的。动态测试.h:#pragmaonce#include#includenamespacedynamic{templatevoiderasure_destroy(constvoid*p){reinterpret_cast(p)->~T();}templatevoiderasure_c

c++ - 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc

以下代码:#includetemplateautof(){}intmain(){std::array{f};}使用clang7.0编译,但使用gcc8.2失败并显示消息prog.cc:Infunction'intmain()':prog.cc:7:20:error:classtemplateargumentdeductionfailed:std::array{f};^prog.cc:7:20:error:nomatchingfunctionforcallto'array()'Infileincludedfromprog.cc:1:/opt/wandbox/gcc-8.2.0/inclu

c++ - GCC 是否准备好用于 C++14 生产代码?

在thiswebpage,GCC对ISOC++14标准的支持定义为“实验性”。因为我想在我的C++代码中使用C++14对C++11的一些改进(例如std::make_unique和通用lambdas),我是否可以安全地使用GCC4.9的-std=c++14选项用于生产代码,或者当前的GCC/C++14状态有点像“测试版”,因此GCC/C++14还没有准备好生产代码? 最佳答案 iscurrentGCC/C++14statuskindoflike"beta"andsoGCC/C++14notreadyforproductioncode

c++ - Visual C++ 和 gcc 之间从 std::isblank 返回的结果不一致。哪一个是错误的?

在Windows上的VisualC++和Ubuntu上的gcc之间调用std::isblank时,我看到了不一致的行为,我想知道哪个是正确的。在两个编译器上——当默认语言环境是“C”语言环境时——以下调用返回falsestd::isblank('\n');这是我所期望的。它与我在cppreference.com上看到的一致InthedefaultClocale,onlyspace(0x20)andhorizontaltab(0x09)areclassifiedasblankcharacters.但是对于C++,我们还有采用std::locale参数的版本std::isblank('\n

c++ - gcc 如何优化这个循环?

所以我遇到了一些奇怪的行为,我将其简化为以下最小示例:#include#includeintmain(){std::vectorvec;for(inti=0;i使用gcc7.3.0编译时使用命令c++-Wall-O2program.cpp-oprogram我没有收到任何警告。运行该程序会产生以下输出:01002003004005006007008009001000110012001300[snipseveralthousandlinesofoutput]107374160010737417001073741800terminatecalledafterthrowinganinstanc