这个问题是由于无法对auto使用统一初始化语法而产生的。关键字,因为它将其视为std::initializer_list(评论中的解释here)。以下面的代码为例:classX{};intx(X());//functionprototype(1)autox(X());//copy/moveconstructionofanX,functionprototypeorcompile-timeerror?编译器对autox做了什么?每种可能性的推理:复制/移动构造:我认为这是正确的行为,因为(1)被视为一种缺陷。函数原型(prototype):似乎不太可能,因为没有尾随返回类型。编译时错误:如
classA{inta;public:A(constA&)=delete;A&operator=(constA&)=delete;A():a{0}{}};intmain(){autoa=A{};}上面的代码没有编译,我得到以下错误:C2280'A::A(constA&)':attemptedtoreferenceadeletedfunction我正在使用visualstudio2015编译器。我的理解是成员初始化语法编译器应该直接使用默认构造函数,这是在没有自动时发生的情况,并且在main中我使用Aa{}。所以我想知道在这种情况下与auto有什么关系。 最佳
将局部变量定义为右值引用或转发(通用)引用有什么意义?据我所知,任何有名称的变量都是左值,并且将被视为左值。例子:Widget&&w1=getWidget();auto&&w2=getWidget();w1和w2都是左值,如果稍后将它们作为参数传递,将被视为左值。他们的decltype可能不是,但这有什么区别呢?为什么有人需要以这种方式定义变量? 最佳答案 如果您有一个函数返回一个无法移动的临时对象。Foosome_function();auto&&f=some_function();这是合法的。autof=some_functio
我正在试验constexprauto和字符串文字以获得我可以与std::begin一起使用的字符数组以一般方式,当我遇到无法解释的事情时:表达式std::extent::value,其中foo使用自动引用声明,产生零。#include#includenamespace{auto&ARRAY_REFERENCE="foo";templatestd::size_tnumberOfElementsIn(T(&)[N]){returnN;}}intmain(){std::cerr::value上面的代码给出了输出std::extentappliedtoARRAY_REFERENCE:0Numb
我在异常类中遇到了auto_ptr的问题,我最终将其简化为:#includeclassMyException{std::auto_ptrm_foo2;};intmain(){try{throwMyException();}catch(constMyException&){}return0;}编译失败:/perforce/unstable/test/Common/Exceptions/TestException4.cpp:Infunction'intmain()':/perforce/unstable/test/Common/Exceptions/TestException4.cpp:1
为了尽可能多地使用STL,我想知道是否可以结合使用std::generate和std::back_inserter以便我可以执行与以下代码相同的操作:staticconstsize_tnitems=1024*1024;std::stringmrbig;for(size_tpos=0;pos我试过了std::generate_n(std::back_inserter(mrbig),nitems,[](){return'a'+(rand()%26);});它似乎工作正常,但我想确定我没有搞砸什么。 最佳答案 generate_n要求它的
我正在尝试编写一个C++lambda函数,但不喜欢必须使用auto作为类型。目前它看起来像:#includeintmain(){//Sendstheaddressofanintegertoafunctionwhichprintsoutthecontents;autoprint_int=[](int*a){std::cout但是,我想更改auto类似于std::function但我不确定如何。的答案Whatisthetypeofalambdafunction?似乎相关,但我不确定如何调整它。谢谢。 最佳答案 Lambda应该与auto
下面的函数OK吗:voidDoSomething(auto_ptr&a).... 最佳答案 你可以做到,但我不确定你为什么要这样做。如果您使用auto_ptr来指示ptr的所有权(正如人们通常所做的那样),那么如果您想将ptr的所有权转移给函数,则只需将auto_ptr传递给函数,在这种情况下您将按值传递auto_ptr:voidDoSomething(auto_ptra)因此任何调用DoSomething的代码都会放弃ptr的所有权:auto_ptrp(newint(7));DoSomething(p);//pisnowempty
考虑以下代码:#include#include#includeusingnamespacestd;structA{inta;A(inta_):a(a_){}};intmain(){vector>as;for(inti=0;ia(newA(i));as.push_back(a);}for(vector>::iteratorit=as.begin();it!=as.end();++it)couta当尝试编译它时,我从g++得到以下模糊的编译器错误:g++-O0-g3-Wall-c-fmessage-length=0-MMD-MP-MF"src/proba.d"-MT"src/proba.d
考虑以下程序:externintx;autox=42;intmain(){}Clang3.5接受它(livedemo),GCC4.9和VS2013不接受(livedemofortheformer)。谁是对的,C++标准中规定的正确行为在哪里? 最佳答案 令人惊讶的是,标准中关于此的内容很少。我们听到的关于重新声明的所有信息是:[C++11:3.1/1]:Adeclaration(Clause7)mayintroduceoneormorenamesintoatranslationunitorredeclarenamesintroduc