草庐IT

auto-elevation

全部标签

c++ - Clang 和 GCC 之间的 const auto std::initializer_list 区别

我试图了解在结合初始化列表和constauto时C++11的正确行为应该是什么?.对于以下代码,我在GCC和Clang之间得到了不同的行为,并且想知道哪个是正确的:#include#include#includeintmain(){conststd::initializer_listl1={1,2,3};constautol2={1,2,3};std::cout用g++编译的输出是:explicit:St16initializer_listIiEauto:St16initializer_listIKiE虽然clang++编译的版本产生:explicit:St16initializer_

c++ - 在调用函数之前如何推断 auto ?

在尝试functionreturntypededuction时autofunc();intmain(){func();}autofunc(){return0;}错误:在扣除“auto”之前使用“autofunc()”有没有办法在调用前不用指定定义就可以使用这个功能?对于大型调用树,重新排列函数变得复杂,以便在调用它们的所有位置之前看到它们的定义。当然可以推迟评估,直到找到特定的函数定义,然后可以推断出auto。 最佳答案 不,没有。即使忽略实际问题(需要多遍编译,通过相互递归的类型定义容易产生不可判定的返回类型,当一切都解决时难以隔

c++ - 使用 Auto 和 Lambda 处理信号?

我已经编写了这个程序,它有一个main函数,在其中,我创建了两个套接字,如下所示:intsockfd1=socket(AF_INET,SOCK_STREAM,0);intsockfd2=socket(AF_INET,SOCK_STREAM,0);现在我用它们做一些事情,当用户按下Ctrl+C来终止进程时,我想确保套接字正确关闭,所以我这样做:autosigTermHandler=[&](intparam){close(sockfd1);close(sockfd2);};signal(SIGTERM,sigTermHandler);但是当编译为g++-std=gnu++0x.cpp时会引

c++ - 为什么 auto_ptr 似乎违反了 Visual C++ 上的私有(private)继承?

背景信息:这是在VisualStudio2008上检测到的,并在VisualStudio2013上再次确认。G++对代码大喊大叫,而Visual默默地接受了私有(private)继承漏洞。所以,在VisualC++上,我们有以下代码:classBase{};classDerived:Base{};//inheritsprivately.Addingexplicitlythe//keywordprivatechangesnothingintmain(){std::auto_ptr(newDerived);//compiles,whichisNOTEXPECTEDstd::auto_ptr

c++ - 我应该停止使用 auto_ptr 吗?

我最近开始欣赏std::auto_ptr,现在我读到它将是deprecated.我开始在两种情况下使用它:工厂的返回值传达所有权转让例子://Exceptionsafeandmakesitclearthatthecallerhasownership.std::auto_ptrComponentFactory::Create(){...}//Thereceivingmethod/functiontakesownershipofthepointer.Zeroambiguity.voidsetValue(std::auto_ptrinValue);尽管存在有问题的复制语义,但我发现auto_

c++ - 使用 auto 关键字时不遵守对齐 16?

使用VS2012编译并使用DirectXMath库时,我遇到了一个问题,编译器似乎没有对齐我的XMMATRIX。我将问题简化为以下内容。#includeusingnamespaceDirectX;int_tmain(intargc,_TCHAR*argv[]){autom1=XMMatrixIdentity();autom2=XMMatrixIdentity();autot1=XMMatrixTranspose(m1);//sometimesaccessviolationoccurshereautot2=XMMatrixTranspose(m2);//orsometimesherere

c++ - 为什么 'auto' 声明都必须是同一类型?

似乎不允许使用auto关键字声明多个不同类型的变量。但是,我无法弄清楚标准中会阻止它的措辞。autoi=1,j=1.0;//deductionfailure(severalcompilers)从历史上看,我理解,因为您只有一个decl-specifier-spec。然而,标准中的规则似乎并没有排除,事实上它们鼓励auto可以是每个不同的类型。考虑以下段落:8-3Eachinit-declaratorinadeclarationisanalyzedseparatelyasifitwasinadeclarationbyitself.7.1.6.4-7Ifthelistofdeclarato

c++ - 将 auto_ptr 与 new char[n] 一起使用是否错误

如果我声明一个临时自动删除的字符缓冲区使用std::auto_ptrbuffer(newchar[n]);然后当缓冲区超出范围时,缓冲区会被自动删除。我会假设缓冲区是使用delete删除的。但是缓冲区是使用new[]创建的,所以严格来说应该使用delete[]删除缓冲区。这种不匹配可能导致内存泄漏的可能性有多大? 最佳答案 对用new[]分配的指针调用delete的行为是undefined.如您所料,auto_ptrdoescalldelete当智能指针超出范围时。您需要担心的不仅仅是内存泄漏——崩溃和其他奇怪的行为也是可能的。如果

c++ - 是否可以在初始化的函数指针声明中使用 `auto` 关键字作为返回类型?

以下代码compilessuccessfullybothwithclang++3.8.0andg++7.2.0(编译标志是-std=c++14-O0-Wall-Wextra-Werror-pedantic-errors):#includeintfoo_int(int){std::cout它是有效的C++代码吗?注意decltype(auto)是rejectedbothbyclang++andg++inthesamesituation. 最佳答案 编译器的行为正确。来自[dcl.spec.auto]Theautoanddecltype

c++ - 使用 decltype(auto) 的基于范围的 for 循环

是否存在decltype(auto)比auto更好的选择(可能与&、&&或cv限定符)在使用基于范围的for循环时?换句话说,你会写下面的代码吗?for(decltype(auto)item:range){//...} 最佳答案 decltype(auto)在输入迭代器按值返回时生成不同的类型。auto&&创建对临时对象的右值引用,而decltype(auto)创建本地拷贝(在C++17中,它只是命名临时对象,因为保证省略更改).这没什么区别。在C++11/14中,在decltype(auto)的情况下,它需要一个移动ctor(实际