草庐IT

c++ 是指向文字的常量指针有效吗?

我知道左值可以转换为常量引用。我很好奇我是否可以获得指向这些左值的指针。如果我写constint*p=&3;//ERROR:lvaluerequiredasunaryoperand'&'我收到这个错误。然而,constint*p=&((constint&)3);这个编译。在这种情况下,*p的结果是否保证为3? 最佳答案 这构造了一个临时的int(3)并将其绑定(bind)到一个const引用。p指向那个临时的。临时对象的生命周期被延长以匹配引用的生命周期——但引用本身是一个临时对象并在分号处被销毁,留下p一个悬空指针。之后任何使用p

c++ - 构造函数和函数中的 CPP 引用

我对下面的代码有点困惑。`classsample{public:sample(){}sample(sample&Obj){}};voidfun(sample&Obj){}intmain(){samples(sample());fun(sample());return0;}出现以下错误由于以下错误,编译失败。main.cpp:在函数“intmain()”中:main.cpp:29:19:错误:从类型为“sample”的右值中对类型为“sample&”的非常量引用进行无效初始化fun(sample());我知道将fun中的参数从sample&obj更改为constsample&obj将解决

c++ - 模板参数的引用变量的问题

下面的小例子说明了我的问题:templatestructX{staticvoidxxx(T&x){}staticvoidxxx(T&&x){}};intmain(intargc,char**argv){intx=9;X::xxx(x);//OK.X::xxx(x);//ERROR!return0;}错误信息(海湾合作委员会):error:‘staticvoidX::xxx(T&&)[withT=int&]’cannotbeoverloadederror:with‘staticvoidX::xxx(T&)[withT=int&]’为什么?T=int&--->staticvoidxxx(T

C++11 左值、右值和 std::move()

我有以下代码:#includeusingnamespacestd;voidtest(int&a){cout哪些输出:lvalue.rvaluelvalue.lvalue.std::move()和int&&是右值引用,我想知道为什么test(std::move(a))和test(b)输出左值?与签名匹配和函数重载有关吗? 最佳答案 输出应该是:lvalue.rvaluervaluelvalue.右值表达式和右值引用类型的表达式之间有一个非常重要的区别。b的类型是对int的右值引用,但表达式b是左值;它是一个变量,你可以取它的地址。这就

c++ - 临时对象和引用有什么关系?

人们经常会读到不能将普通左值引用绑定(bind)到临时对象。因此,当他们不想涉及复制时,可以经常看到类A的方法将constA&作为参数。然而,这样的构造是完全合法的:double&d=3+4;因为它没有将临时对象3+4绑定(bind)到引用d,而是使用对象3+4初始化引用。正如标准所说,只有当值不是类型或引用(或继承)时,引用才会获胜't使用从使用转换或sth的临时对象(即另一个临时对象)获得的对象进行初始化。在这种情况下,您可以看到:inti=2;double&d=i;那是不合法的,因为i不是double类型,也不是从它继承的。然而,这意味着临时对象可以绑定(bind)到引用——但它

c++ - const ref lvalue to non-const func return value 是否专门减少拷贝?

我遇到了一个C++习惯,我试图研究它以了解它的影响并验证它的用法。但我似乎找不到确切的答案。std::vectorgetThings();voiddo(){conststd::vector&things=getThings();}这里我们有一些返回非const&值的函数。我看到的习惯是在分配函数的返回值时使用const&左值。提出这个习惯的原因是它减少了拷贝。现在我一直在研究RVO(返回值优化)、复制省略和C++11移动语义。我意识到给定的编译器可以选择阻止通过RVO进行复制,不管这里是否使用了const&。但是,在防止复制方面,const&左值的使用对非const&返回值有任何影响吗

c++ - 铿锵错误 : non-const lvalue reference cannot bind to incompatible temporary

我有一段代码可以在MSVC上正常工作,但无法用clang++编译voidMyCass::someMethod(){std::wstringkey(...);auto&refInstance=m_map.find(key);//errorhere}其中m_map定义为std::map>m_map;和clang提示non-constlvaluereferencecannotbindtoincompatibletemporary我有点了解正在创建一个临时文件,但不确定如何解决这个问题。有什么想法吗? 最佳答案 右值不能绑定(bind)到非

c++ - 编译为 C++ 但不是 C(错误 : lvalue required as unary '&' operand)

当我使用C++而不是C时,这一行编译:gmtime(&(*(time_t*)alloca(sizeof(time_t))=time(NULL)));//用alloca创建一个左值我对这种差异感到惊讶。甚至没有针对C++的警告。当我指定gcc-xc时,消息是:playground.cpp:25:8:error:lvaluerequiredasunary'&'operandgmtime(&(*(time_t*)alloca(sizeof(time_t))=time(NULL)));^这里的&不就是一个address-of操作符吗?为什么在C和C++中不同?虽然我可以在C中使用复合字面量,但

c++ - 富()= 42; <- 这怎么可能?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:WhatarethedifferencesbetweenpointervariableandreferencevariableinC++?为了理解新C++标准中的通用引用,我阅读了一篇关于右值的文章,发现了以下作为左值示例的内容//lvalues://inti=42;i=43;//ok,iisanlvalueint*p=&i;//ok,iisanlvalueint&foo();foo()=42;//ok,foo()isanlvalueint*p1=&foo();//ok,foo()isanlvalue这里的i

c++:函数左值或右值

我刚刚开始通过阅读thispage了解c++11中的右值引用,但我卡在了第一页。这是我从该页面获取的代码。int&foo();foo()=42;//ok,foo()isanlvalueint*p1=&foo();//ok,foo()isanlvalueintfoobar();j=foobar();//ok,foobar()isanrvalueint*p2=&foobar();//error,cannottaketheaddressofanrvalue为什么foo()是左值?是因为foo()返回的int&基本上是一个左值吗?为什么foobar()是右值?是因为foobar()返回int吗