草庐IT

const_buffers

全部标签

c++ - 为什么 as_const 的 const&& 重载被删​​除了?

在blogontheprogressofC++17上我阅读了以下内容:P0007proposesahelperfunctiontemplateas_const,whichsimplytakesareferenceandreturnsitasareferencetoconst.templatestd::add_const_t&as_const(T&t){returnt}templatevoidas_const(Tconst&&)=delete;为什么要删除const&&重载? 最佳答案 考虑如果你没有重载会发生什么,并尝试传入一个co

c++ - 当 x 为 const int[] 时,x[0] == 1 C++11 中的常量表达式?

以下C++11程序是否格式错误?constintx[]={1,2,3};static_assert(x[0]==1,"yay");intmain(){}gcc和clang似乎都这么认为,但是为什么x[0]==1不是一个常量表达式呢?x[0]==1subscriptoperator*(x+0)==1array-to-pointerconversion(int*p=x)*(p+0)==1pointeraddition*p==1indirection(lvaluey=x[0])y==1lvalue-to-rvalueconversion:anon-volatileglvalue(yes,x[

c++ - 对于 const 的引用,std::is_const 的等价物是什么?

考虑代码:intconstx=50;intconst&y=x;cout::value::value这是有道理的,因为y不是const引用,它是对const的引用.有没有foo这样std::foo::value是1?如果不是,如何定义我自己的? 最佳答案 使用remove_reference:#include#include#includeusingnamespacestd;intmain(){intconstx=50;intconst&y=x;cout::type>::value::type>::valueSeeoncoliru

c++ - 为什么 ostream::write() 在 C++ 中需要 ‘const char_type*’ 而不是 ‘const void*’?

fwrite()C中的函数使用constvoid*restrictbuffer作为第一个参数,因此您可以将指针传递给您的struct直接作为第一个参数。http://en.cppreference.com/w/c/io/fwrite例如fwrite(&someStruct,sizeof(someStruct),1,file);但在C++中,ostream::write()需要constchar_type*,这会迫使您使用reinterpret_cast.(在VisualStudio2013中,它是constchar*。)http://en.cppreference.com/w/cpp/

c++ - const 成员函数和 typedef,C++

假设我们要通过typedef声明const成员函数:typedefintFC()const;typedefintF();structA{FCfc;//fine,wehave'intfc()const'constFf;//notfine,'const'isignored,sowehave'intf()'};由于const被忽略,程序编译得很好。为什么const被函数忽略?由于我们可以以这种方式形成const指针,我唯一能想到的就是“C遗产”。标准对此有什么说法吗? 最佳答案 C++14标准,[dcl.fct]pt。7:Theeffec

c++ 通过 const 引用传递

在下面的程序体中包含一个指针vector。Points是x,y,z坐标和point_id的结构。我相信由于body是通过const引用传递的,因此以下步骤应该会产生错误。但是程序运行没有任何问题。你能解释一下为什么会这样吗?voidreadOutFile(constBody&body,intn){....body.bp[0]->points.push_back(Point_id(p,i));} 最佳答案 问题来了:body.bp[0]->points.push_back(Point_id(p,i));^^通过指针间接删除任何常量;相

c++ - const 正确性警告 c++

有谁知道C++编译器提供的任何有助于强制执行const正确性的警告?例如,如果任何C++方法包含一个从未在方法内部修改过的非常量参数,就会产生警告。我看到有一个名为-Wsuggest-attribute=const;的gnu编译器警告。但是,当我使用此标志时,我收到一条错误消息,指出它无法识别。任何想法为什么? 最佳答案 我认为不存在这样的警告,主要是因为它没有用。仅仅因为一个参数没有在调用内部被修改,并不意味着它应该被const只是为了它。想想virtual函数。或许基类的设计者,虽然没有修改基类中的参数,但希望让扩展类来决定是否

c++ - 使用 const char* 作为非类型参数的模板技巧

我非常清楚,直接将constchar*作为模板非类型参数传递是错误的,因为在两个不同的翻译单元中定义的两个相同的字符串文字可能具有不同的地址(尽管大多数编译器使用相同地址的时间)。可以使用一个技巧,请参见下面的代码:#includetemplatevoiddisplay(){std::cout();//(1')display();//(2')//display();//(3')doesn'tcompile//display();//(4')doesn'tcompile}基本上在(1)中,我们声明并定义一个带有外部链接的数组,然后可以将其用作(1')中的模板参数。我非常了解这一点。但是,

c++ - 避免返回的 const locals?

我一直认为constlocals是const是件好事voidf(){constresource_ptrp=get();//...}然而,上周我看到学生在做C++练习并且想知道返回的const指针resource_ptrf(){constresource_ptrp=get();//...returnp;}在这里,如果编译器无法应用NRVO(想象在某些情况下这是真的,可能会返回两个指针之一,具体取决于条件),突然const变成了悲观,因为编译器不能从pmove,因为它是const。在返回的本地人上尝试避免const是个好主意,还是有更好的方法来处理这个问题? 最

c++ - g++ 不允许在 lambda 中通过引用对 const 对象进行广义捕获?

这被g++(4.9.3和5.2.0)拒绝,但被clang3.5.0接受:intmain(){constintci=0;autolambda=[&cap=ci](){};}g++给出error:binding‘constint’toreferenceoftype‘int&’丢弃限定符。似乎g++拒绝允许捕获非常量引用,当然除了使用普通的旧C++11捕获[&ci]。这似乎是一个非常奇怪的约束,也许是g++中的一个错误? 最佳答案 您的代码有效。§5.1.2/11去Aninit-capturebehavesasifitdeclaresan