草庐IT

gcc-statement-expression

全部标签

具有用户类型的 C++20 模板 <auto> 导致 GCC 9 中的 T/const T 类型不匹配

我正在尝试将非类型模板与自定义类型结合使用。structT{};templatestructU{};templatevoidf(U){}intmain(){constexprTt;f(U{});//OKf(U{});//OKf(U{});//Error}模板参数推导失败,gcctrunkwith-std=c++2agetsyop.cpp:10:5:note:templateargumentdeduction/substitutionfailed:yop.cpp:19:21:note:mismatchedtypes‘T’and‘constT’19|f(U{});//Error|^我是不是

c++ - 除非返回值有名称,否则为什么 GCC 无法优化?

考虑这段代码:#includeclassC{std::arraya{};intb{};};Cslow(){return{};}Cfast(){Cc;returnc;}GCC6到9为slow()生成非常臃肿的代码:slow():xoreax,eaxmovDWORDPTR[rsp-25],0movBYTEPTR[rsp-21],0movedx,DWORDPTR[rsp-24]movDWORDPTR[rsp-32],0movWORDPTR[rsp-28],axmovBYTEPTR[rsp-26],0movrax,QWORDPTR[rsp-32]retfast():xoreax,eaxxore

c++ - constexpr 返回数组,gcc 警告

我编写了一个返回数组的constexpr函数。#includeconstexprautoget_str(void)->constchar(&)[4]{return{'T','E','S','T'};}constexprintsum(constchar(&str)[4]){returnstr[0]+str[1]+str[2]+str[3];}intmain(void){constexprints=sum(get_str());std::coutg++4.8正确编译代码,但发出以下警告:test.cpp:Infunction‘constexprconstchar(&get_str())[4

c++ - gcc-4.9.2 : non-type template parameter

我在gcc-4.9.2上有一个奇怪的编译错误,相同的代码在其他编译器上工作,比如gcc-4.8或我能找到的任何clang。问题与non-typetemplate-arguments有关.所以考虑一下:#include#includeinttemplateParam;templatestructTestTemplate{intvalue(){}};templateintTestTemplate::value(){returntemplateParam;}TestTemplatetestVariable;intmain(){std::cout我在gcc-4.9.2中遇到以下错误:prog.

c++ - 这是在 C++03 中执行 "Expression SFINAE"的有效方法吗?

在C++11中,SFINAE很容易判断一个表达式是否有效。例如,想象一下检查某些内容是否可流式传输:templateautoprint_if_possible(std::ostream&os,constT&x)->decltype(osprint_if_possible如果os,将只参与过载决议是一个格式正确的表达式。liveexampleongodbolt.org我需要在C++03中做同样的事情,我发现sizeof可以提供帮助(因为我需要一个未评估的表达式上下文)。这是我想出的:templatestructsfinaer{};templatevoidprint_if_possible

c++ - constexpr 与 std::array - "Non-type template argument is not a constant expression"

这个问题在这里已经有了答案:Errorusingaconstexprasatemplateparameterwithinthesameclass(2个答案)关闭9年前。我正在尝试实现以下内容:#include#includeclassClass2{};classClass1{public:staticconstexpruint8_tGetMax(){return5;}staticconstexpruint8_tGetMin(){return0;}staticconstexpruint8_tGetCount(){returnGetMax()-GetMin()+1;}private:std

c++ - GCC:如何找到不丢弃目标文件的原因

我有一个可执行文件,它链接到一个包含大量函数的大型.a存档。可执行文件只使用了这个存档中的一小部分功能,但出于某种原因,它从中提取了所有内容,最终变得非常大。我怀疑可执行文件正在使用的某些功能以某种方式引用了它不应该引用的内容,这会导致其他所有内容都被拉出。是否可以让gcc告诉我是什么引用导致在可执行文件中添加特定符号?为什么还会发生这种情况?我试过使用--gc-sections但没有效果。我试过使用--version-script使可执行文件中的所有符号都在本地无效我对-ffunction-sections和-fdata-sections不感兴趣,因为我想丢弃的是对象文件,而不是函数

c++ - 将 std::vector 作为模板模板参数传递时出错 - 在 GCC 中有效,在 MSVC 中失败

下面的代码#include#include#include#include#include#include#defineBEGIN_TO_END(container)container.begin(),container.end()templateclassOutputContainerType,classInContainer>OutputContainerTypeconvertContainer(constInContainer&in){OutputContainerTyperesult;std::transform(BEGIN_TO_END(in),std::back_inser

c++ - gcc 的 asm volatile 是否等同于递归的 gfortran 默认设置?

我只是在研究C++和Fortran中的递归函数,我意识到Fortran中的一个简单递归函数几乎是与其等效的C++函数一样快。现在,在进入这个之前,我知道这里有类似的问题,特别是:Whydoesaddingassemblycommentscausesuchradicalchangeingeneratedcode?Workingofasmvolatile(“”:::“memory”)Equivalenttoasmvolatileingfortran但是,我有一点更具体和困惑,因为Fortran编译器似乎正在做你可以用gcc中的asmvolatile实现的事情。为了给您一些上下文,让我们考虑

c++ - clang 中明确指定的参数无效,但在 gcc 中编译成功——谁错了?

以下代码在g++中编译没有问题:#include#include#includetemplatevoidtest(constT&value){std::tuplex;std::cout(x);}intmain(){test(std::integral_constant());}我使用了这个命令:g++test.cpp-otest-std=c++14-pedantic-Wall-Wextra但是,当我将g++切换到clang++(使用g++5.1.0和clang++3.6.0)时,出现以下错误:test.cpp:9:18:error:nomatchingfunctionforcallto