我在g++4.8.1和clang++3.4的行为之间存在差异。我有一个A类,它是文字类型的,它有一个explicitconstexpr转换函数来输入enumclassE.Gcc允许我在某些情况下使用转换函数从A类型的常量表达式初始化constexpr类型的E变量,但是不是当变量是静态类成员时(下面的e2)Clang拒绝所有上下文中的初始化(e1、e2和e3)。根据[over.match.conv]p1,在这里可以使用显式转换函数enumclassE{e};structA{explicitconstexproperatorconstE()constnoexcept{returnE::e;
#includeusingnamespacestd;classExample{public:Example(inta,intb,intc):m_a(a),m_b(b),m_c(c){//Wrongindentationhereduetothecoloninaboveline,{shouldbeunderEprintf("\nThe3argumentconstructorinvoked\n");}//Wrongindentationagainprivate:intm_a;intm_b;intm_c;};大家好,我在C++的构造函数初始化列表中gvim的缩进有一点问题。我在.gvimrc中
考虑一下:std::vectorv(1,0);这在VC++10上编译得很好(即使在最大警告级别也没有警告)。但是,它不会在mac上使用llvm编译,也不会在linux上使用gcc编译,会出现类似“assigningtoint*fromincompatibletypeconstint”这样的错误。我不是在寻找解决方案——我知道第二个参数是不必要的,或者static_cast可以修复错误。我认为零可以隐式转换为任何指针类型。是什么赋予了?我可以执行以下操作:int*i=0;int*const&ii=0;constintt=0;i=t;我知道vector构造函数签名采用constT&当扩展为
我在初始化指针数组时遇到了问题。我发现用gccc++(4.6.0)编译的是:MyClass**a=newMyClass*[100];并不总是初始化指针数组。(大多数时候它确实给了我一个空指针数组,这让我很困惑)MyClass**a=newMyClass*[100]();确实将数组中的所有指针初始化为0(空指针)。我正在编写的代码可以跨Windows/Linux/Mac/BSD平台移植。这是gccc++编译器的一个特殊功能吗?还是标准的C++?标准中的哪个地方是这样说的? 最佳答案 这个值初始化是标准的C++。相关标准在C++98和C
[跟进this问题]最近我一直在处理指向C风格数组的智能指针。我最终完成了推荐的事情并改为使用指向vector的智能指针,但在那段时间里,我得到了一些建议:不要使用shared_ptr对象来管理最初使用make_unique创建的数组因为它不会调用delete[]而是delete.这对我来说似乎不合逻辑,我检查了两个Coliru和标准:这段代码:#include#includeintmain(){std::coutmyUnique(customArrayAllocator(4),customArrayDeleter);std::coutmyShared=std::move(myUniq
假设我有一个类可以通过constexpr函数返回常量表达式:templatestructFoo{constexprintBar()const{returnN;}};如果我想从Foo::Bar()初始化constexpr值,我应该如何传递类型为Foo的参数?我已经尝试了这两个,每个示例中都有一个constexpr变量来测试它是否可以被初始化:templateconstexprintByValue(Foof){constexprinti=f.Bar();returnf.Bar();}templateconstexprintByReference(constFoo&f){constexpri
我不明白为什么你不能编译一个类,它既有一个成员(不是默认可构造的),也有一个大括号或相等的初始值设定项和一个继承的构造函数。g++说:test.cpp:22:15:error:useofdeletedfunction‘Derived::Derived(float)’Derivedd(1.2f);test.cpp:16:13:note:‘Derived::Derived(float)’isimplicitlydeletedbecausethedefaultdefinitionwouldbeill-formed:usingBase::Base;test.cpp:16:13:error:no
我为此提交了一个GCC错误,但我宁愿仔细检查一下。考虑以下程序:#includetemplatevoidF(A&&a){T(std::forward(a));}//Note:()syntax.intmain(){inti;F(i);}和:#includetemplatevoidF(A&&a){T{std::forward(a)};}//Note:{}syntax.intmain(){inti;F(i);}最新的Clang和MSVC编译器接受这两个程序。GCC5及更高版本接受第一个程序但拒绝第二个程序,声称将类型为“int”的右值表达式无效转换为类型为“int&”。这是GCC错误吗?或者
我有一个函数模板,它采用某种可调用类型的参数,并使用std::bind为原始可调用对象创建一个具有预定义参数值的新可调用对象。我用转发引用参数和std::forward编写了它,如下所示:templateautomake_example_caller(F&&f){returnstd::bind(std::forward(f),123,456,789);}cppreferencedocumentationforstd::bind表示绑定(bind)对象“包含一个由std::decay::type构造的std::forward(f)类型的成员对象”。由于std::bind将函数转发给它的内
我习惯于认为全局变量/静态类成员的所有初始化都发生在main()的第一行之前。但我最近在某处读到该标准允许稍后进行初始化以“协助动态加载模块”。当动态链接时我可以看到这是真的:我不希望在我dlopen'ed库之前初始化库中的全局初始化。但是,在一组静态链接在一起的翻译单元(我的应用程序的直接.o文件)中,我会发现这种行为非常不直观。这只会在动态链接时延迟发生,还是可以随时发生?(或者我读错了什么?;) 最佳答案 该标准在3.6.2/3中有以下内容:Itisimplementation-definedwhetherornotthedy