草庐IT

c++ - 据我所知,根据 C++14 中的 §5.19/3 和 §5.19/2,这段代码不应该编译

但它在gcc4.9.0中编译。参见liveexample:#includestructA{constexprA():i(5){}int&&f(){returnstd::move(i);}inti;}a;A&&f(A&a){returnstd::move(a);}intmain(){Aa;intb[a.f()]{0,1,2,3,4};std::cout从§5.19/3我们有:Anintegralconstantexpressionisanexpressionofintegralorunscopedenumerationtype,implicitlyconvertedtoaprvalue,

c++ - 成员函数什么时候应该有 const 限定符,什么时候不应该?

大约六年前,一位名叫HarriPorten的软件工程师写道thisarticle,问这个问题,“成员函数什么时候应该有const限定符,什么时候不应该?”我发现这是我能找到的关于这个问题的最好的文章,我最近一直在努力解决这个问题,我认为在我发现的关于const正确性的大多数讨论中都没有很好地涵盖这个问题。由于当时还没有像SO这样强大的软件信息共享站点,所以我想在这里重新提出这个问题。 最佳答案 这篇文章似乎涵盖了很多基础知识,但作者仍然对返回指针的函数的const和non-const重载有疑问。文章的最后一行是:许多人可能会回答“视

c++ - 根据 C++11 标准中的 §12.1/4,代码不应编译

§12.1/4:及其第一个要点AdefaultconstructorforaclassXisaconstructorofclassXthatcanbecalledwithoutanargument.Ifthereisnouser-declaredconstructorforclassX,aconstructorhavingnoparametersisimplicitlydeclaredasdefaulted(8.4).Animplicitly-declareddefaultconstructorisaninlinepublicmemberofitsclass.Adefaulteddef

c++ - 这段代码不应该根据标准中的 12.8p2 编译吗?

此代码无法在VS2010中编译。它发出错误C2440:“参数”:无法从“A”转换为“A&”,但根据标准中的12.8p2,A::A(A&)是有效的复制构造函数,并且a是main()中表达式Ab=foo(a);的左值。#includeclassA{public:intx;A(inta){x=a;std::cout 最佳答案 我会说这取决于您所谈论的标准。假设使用C++11,那么我的看法是它应该没问题并且应该产生以下结果:Constructor正如您指出的,传递给foo的a是一个左值。但是,foo的返回值是一个右值,因此应该在C++11之

c++ - 线程不应该访问其他线程的堆栈是否有原因?

我刚刚在我的项目中使用IntelParallelinspector,它显示了一条警告:Oneormorethreadsintheapplicationaccessedthestackofanotherthread.Thismayindicateoneormorebugsinyourapplication.我确实有一些对象分配在线程之间共享的堆栈上。我不明白为什么这是个问题。有什么提示吗? 最佳答案 这不是错误,只是可能是错误的。像IntelParallelInspector这样为您的程序提供额外诊断的工具必须在误报和漏报之间做出权衡

c++ - char* 不应该隐式转换为 std::string 吗?

这是我的代码:#includeusingnamespacestd;structST{};booloperator==(conststructST*s1,conststring&s2){returntrue;}intmain(){structST*st=newST();constchar*p="abc";if(st==p){return0;}return1;}编译错误:prog.cpp:14:12:error:comparisonbetweendistinctpointertypes‘ST*’and‘constchar*’lacksacast[-fpermissive]if(st==p)

c++ - 析构函数不应该用指针声明吗?在 C++ 中

在C++0x-n3290草案中:他们在section:Destructors中添加了:12.4/2ndpointlastline**Adestructorshallnotbedeclaredwitharef-qualifier.**在c++03草案中....他们没有在析构函数中提到这一点?我的问题是*~S();//thisdeclarationisallowedornotaccordingtotheStandard's//**~S();***~S();etc...........允许这种类型的声明吗?他没有在草案的任何地方描述这个......声明?在GCC4.6.0,Sun/Oracl

c++ - const - 它不应该改变吗

在运行此C++代码时,我希望输出为Abc,但结果为FFF,这是为什么呢?name不是指向常量char吗?#includeintmain(){constchar*name="Abc";name="FFF";std::cout 最佳答案 是的,正如您所说,它指向一个constchar,但它不是一个常量指针。您正在更改您所指向的内容,而不是您所指向内容的内容。换句话说,在您重新分配指针后,保存“Abc”的内存仍然保存字符“Abc”。对于常量指针,您需要constchar*constname="Abc";。在这种情况下,它不会编译,因为您无

c++ - 下面显示的片段在 Coliru 和 Ideone 中编译,但根据 iso § 8.5 p6 它不应该,或者我错过了什么?

从C++11标准§8.5p6我们有:Ifaprogramcallsforthedefaultinitializationofanobjectofaconst-qualifiedtypeT,Tshallbeaclasstypewithauser-provideddefaultconstructor.下面的代码应该不编译。但在Coliru和Ideone中确实如此.classA{};intmain(){constAa;}编辑:在试图理解这里发生的事情时,我最终得到了以下代码,它可以编译(至少它符合标准,因为A有一个用户提供的构造函数).但随后我想到了以下问题:哪个标准子句确实保证a.b.j初

c++ - 什么时候以及为什么不应该将基类中的析构函数定义为虚拟的?

下面的这个例子说明了如何防止派生类被复制。它基于一个基类,其中复制构造函数和复制赋值运算符都被声明为private。classUncopyable{protected://allowconstructionanddestructionofderivedobjects...Uncopyable(){}~Uncopyable(){}private://butpreventcopying...Uncopyable(constUncopyable&);Uncopyable&operator=(constUncopyable&);};我们可以使用这个类,结合私有(private)继承,使类不可复