有什么方法可以知道一个对象是常量对象还是常规对象,例如考虑以下类classString{String(constchar*str);};如果用户从String创建一个const对象,那么没有理由复制传递的原生字符串,因为他不会对其进行任何操作,他唯一要做的就是获取字符串大小、字符串搜索等不会改变字符串的函数。 最佳答案 复制有一个很好的理由——你无法知道constchar*的生命周期与String对象的生命周期相同。不,没有办法知道您正在构造一个const对象。 关于c++-const对
下面的代码可以正常编译:templatevoidf(constT&item){return;}intmain(){f("conststringliteral");}ideone编译成功:http://ideone.com/dR6iZ但是当我提到返回类型时,它无法编译:templateTf(constT&item){returnitem;}intmain(){f("conststringliteral");}现在它给出错误:prog.cpp:6:error:nomatchingfunctionforcallto‘f(constchar[21])’ideone的代码:http://ideo
我想使用std::tm()作为std::map容器的键。但是当我尝试编译它时,出现了很多(10)个错误。例如:1.errorC2784:'boolstd::operator&,const_Elem*)':couldnotdeducetemplateargumentfor'conststd::basic_string&'from'consttm'c:\programfiles(x86)\microsoftvisualstudio10.0\vc\include\xfunctional1252.errorC2784:'boolstd::operator&)':couldnotdeducete
你能举一个使用libpq从远程机器向PostgreSQL数据库插入二进制数据的例子吗?我的第二个问题是:是否有任何其他API比使用C++的libpq更有效。谢谢 最佳答案 PostgreSQL中有两种blob—BYTEA和LargeObjects。我建议不要使用大对象,因为您无法将它们连接到表中。对于BYTEA,你会在libpq中使用这样的东西:PGresult*put_data_to_tablename(PGconn*conn,int32_tid,intdata_size,constchar*constdata){PGresult
我有以下情况需要从t1move构造t2。不幸的是,这是不可能的(我想是违反常量的)从foo的调用者透明地处理该问题的正确方法是什么?(即不需要按值传递和显式std::move)structT{T()=default;~T()=default;T(T&&)=default;};Tfoo(constT&t){Tt3;if(predicate)returnt3;elsereturnstd::move(t);}intmain(){Tt1;Tt2=foo(t1);return0;} 最佳答案 Whatistherightapproachtoh
在C++11中,const左值引用可以用可变右值引用来初始化。右值引用的值然后可以更改,从而对const左值所引用的内容产生可见的突变。这是一个例子:int&&rval=3;constint&lval=rval;cout输出(来自clang3.2和gcc4.8.2,均使用-std=c++11):lval=3rval=3lval=4我会猜测这样做的原因是不能通过左值引用修改所指对象,但可以通过右值引用修改它。但是,我不明白为什么允许const左值引用可变对象。有人能解释一下这样做的理由并给出处理这种情况的最佳做法吗?另外,是否还有其他类似的例子可以颠覆constness?
有一个非常流行的问题是“std::pairvsstructwithtwofields”。但我有一个关于将first和second值重新分配给语义命名变量的问题。在常规情况下,我们有这样的事情:conststd::pairresult=processSomething();std::cout但是如果我们先将它们分配给引用变量呢:conststd::pairresult=processSomething();constint&numTotal=result.first;constint&numSuccessful=result.second;std::cout这使我们无需编写有关first
对不起,标题有点晦涩,但它确实说明了一切。这就是我的意思classA{voidDoSomething();//non-const}ClassB{public:B(A&a):_a(a){}//constfunctionvoidDoSomethingElse()const{//Isthereawaytodisallowthis?_a.DoSomething();}voidDoEvenMore(){//ShouldbeOK_a.DoSomething();}private://Can'tmakeitconstA&becauseitneeds//benon-constfornon-constf
我有两个类,A和B,B派生自A。A有多个构造函数(下例中有2个)。B有一个额外的成员要初始化(它有一个默认的初始化器)。我怎样才能实现B可以使用A的构造函数之一来构造,而不必手动重写B中A的所有构造函数重载?(在下面的示例中,否则我必须为B提供四个构造函数:B():A(){},B(strings):A(s){},B(intb):A(),p(b){},B(strings,intb):A(s),p(b){},而不是只有两个,至少在忽略默认参数的可能性时是这样)。我的方法是完美转发,但是下面的场景会报错:#include#includestructA{A(conststd::string&a
假设我有这两个std::vector:std::vectorv_int(1000);std::vectorv_T(1000);//WhereTiscopy-costytype如果我需要(单独)循环遍历它们而不需要编辑我可能使用的项目:for(constautoitem:v_int){//...}for(constauto&item:v_T){//Note&//...}使用constautoitem:v_T进行迭代太糟糕了,因为每次迭代都会执行一个拷贝。然而,使用constauto&item:v_int不是最佳的,但也不是那么糟糕。因此,如果我需要同时处理它们的代码,我会使用consta