草庐IT

c++ - 仅在 constexpr 函数体内的未计算上下文中使用的参数

下面这段代码用gcc5.3.0编译成功,用clang3.7.0编译失败。在这两种情况下,我都使用了具有相同命令行选项的在线coliru编译器:-std=c++14-O2-Wall-pedantic-pthread。#include//Definitionofconstexprfunction'foo'.constexprstd::size_tfoo(constint&arg_foo){returnsizeof(arg_foo);}//Definitionoffunction'test'.voidtest(constint&arg){//Thefollowinglineproducesa

c++ - 模板中有两个默认参数,这里有什么问题?

下面的代码显示了2个Foo模板,每个模板都有2个默认参数,Foo1有一个单独的原型(prototype)而Foo2没有,它们在其他方面是一样的。为什么第一次调用Foo1会导致编译器(VS2010NativeC++)产生错误,而其他3个调用正常?#include//notneededbuttopreventanswersinthisdirection...#undefmax#undefmintemplatevoidFoo1(Tv1=std::numeric_limits::min(),Tv2=std::numeric_limits::max());templateinlinevoidFo

c++ - 在具有菱形继承和虚拟基类的类中调用函数的策略

如果我们有菱形继承并使用公共(public)虚拟基类,我们可以阻止第一个构造函数被多次调用。现在,我想对构造函数之外的函数做同样的事情。例如代码:#includestructA{virtualvoidfoo(){std::cout产生结果ABACD我想修改它,让它只产生ABCD什么样的策略或模式可以做到这一点?编辑1与以下相比,我更喜欢TonyD的回答。尽管如此,理论上可以使用另一个类的构造函数来定义适当的函数层次结构。具体#includestructA;structB;structC;structD;namespacefoo{structA{A(::A*self);};structB

c++ - 复制省略在默认函数参数中有效吗?

考虑这段代码:structfoo;foo*p;structfoo{foo(){p=this;}};booldefault_arg(foof=foo()){returnp==&f;}boolpassed_in(foo&f){returnp==&f;}intmain(){std::cout我希望对于default_arg和passed_in的调用,f将只是默认构造,因为拷贝将被省略*。这将导致两个调用都返回true。然而,Clang3.7norGCC5.3省略default_arg的默认参数中的拷贝。复制省略在默认参数中有效吗?也许我遗漏了一些关于如何在每次调用时评估默认参数的明显信息。编

c++ - 转发模板参数的常量性,我应该使用转发引用吗?

我想编写一个函数foo,它应该调用其参数的operator(),如下面的(损坏的)代码所示:templatevoidfoo(constT&x){x();}structMyFunctor{intdata;voidoperator()(){/*stuffthatmightmodifythedata*/}};intmain(){foo(MyFunctor{});}显然代码不起作用,因为operator()是非const,但是foo()要求它的参数是常量。作为模板函数,foo()应该与const和非const仿函数一起工作,并且对不挑剔code>const-它的参数。如果我通过将const更改

c++ - 同级友元运算符似乎不参与重载决议

在编写使类能够根据模板参数为operator+提供重载的CRTP模板时,我发现类内友元运算符似乎不参与重载决议,如果没有的话arguments是它在其中定义的类的类型。归结:enumclassFooValueT{zero,one,two};classFoo{FooValueTval_;public:Foo(FooValueTx):val_(x){};Foo&operator+=(Fooother){val_=(FooValueT)((int)val_+(int)other.val_);return*this;}//overloadforFoo+Foo,FooValueT+FooandF

c++ - 我是否应该在我的头文件中包含 <stdio.h>,这样我就可以声明一个接受 FILE* 的函数?

例如在foo.h中:typedefstructfoo_tfoo_t;/*Lotsoffunctiondeclarationsdealingwithfoo_t...*/intfoo_print(constfoo_t*foo);/*Printfootostdout.*/intfoo_fprint(FILE*f,constfoo_t*foo);/*Printfootofilef.*/我不想在foo.h中乱放太多foo.h的用户可能不想包含的其他头文件,但我确实需要声明采用FILE*等类型的函数。我怀疑我是第一个遇到这种困境的人,那么在这种情况下人们通常会做什么呢?还是我想避免在我的头文件中包

c++ - 从模板类调用可变参数函数

我有一个带有可变模板成员函数的模板类,我无法从类外部调用它。这是我正在尝试做的一个简化示例:templatestructfoo{foo(){}templateintrun(){returnsizeof...(I);//orwhatever}};templateintrun_int(){returnfoo().run();//OK}templateintrun_T(){returnfoo().run();//error}当foo被专门化时,我可以毫无问题地调用它的模板成员函数run()。但是,如果我尝试从不特化foo的函数或结构中调用它,gcc(4.7)会发出错误消息“参数包未使用‘..

c++ - unique_ptr 不在编译器资源管理器中生成删除指令?

我一直在研究CompilerExplorer最近。我加载了其中一个采用指针参数的示例,并将其更改为采用unique_ptr参数。但我注意到在输出程序集中,明显没有对operatordelete的调用。我很好奇是否有人知道为什么。这是您可以粘贴到资源管理器中的示例。确保同时将-O3放入编译器选项中。#includeusingstd::unique_ptr;voidmaxArray(unique_ptrx,unique_ptry){for(inti=0;ix[i])x[i]=y[i];}}编辑:同样为了比较,如果我改为粘贴来自cppreference的代码示例之一,那么我会在输出中获取运算

c++ - 函数特化/重载规则示例

我知道你不能部分特化一个函数模板,我也理解典型的函数重载。我需要帮助的是摸索以下4个foo()函数之间的区别。我希望其中一些是完全相同的东西的不同语法?是否有知识渊博的人可以解释每个函数到底发生了什么,它是模板特化还是重载,以及C++编译器如何确定调用什么?//(1)templatevoidfoo(Tt){coutfoo(T)"voidfoo(int*l){coutfoo(int*)"voidfoo(T*l){coutfoo(T*)"程序输出:templatefoo(T)normaloverloadfoo(int*) 最佳答案 评论