草庐IT

c++ - 为什么有的引用类型的变量可以绑定(bind)右值,有的不能?

#includeusingnamespacestd;intmain(){//int&a=3;我不明白为什么编译器不会引发编译错误。由于auto“强制”c成为对常量int的引用,并且引用被引用到左值,这是如何工作的? 最佳答案 如果没有const,这确实无法工作——您会遇到编译错误。但是const在那里,即您不会修改c引用的内容。对于这种情况,标准中有额外的措辞,临时值c正在引用(1+2的结果)将其生命周期延长到引用生命周期的末尾。这与auto完全无关。const在这里产生了不同。 关于c

c++ - 为什么指向函数的指针不能绑定(bind)到左值引用,而函数可以?

使用带和不带符号的函数名有什么区别?我注意到它们在绑定(bind)到模板参数时以不同的方式表现:voidfoo();templatevoidbind(F&);bind(foo);//OKbind(&foo);//Error为什么会这样?这些情况下的推导类型是什么? 最佳答案 注意内置的operator&将返回T*类型的prvalue。所以&foo将返回一个类型为void(*)()的函数指针,它是一个纯右值,不能绑定(bind)到非常量的左值引用;这正是bind()期望的参数,然后它失败了。对于bind(foo),templatepa

C++为什么我不能在具有已删除默认构造函数的对象上使用交换

这个问题在这里已经有了答案:Whydoesamoveconstructorrequireadefaultconstructorforitsmembers?(3个答案)关闭5年前。我正在尝试为使用类Id的对象A实现一个move构造函数。类ID是自动生成的,为了将来编码的完整性,我选择在这样做时删除默认构造函数。然而,当我尝试在A的move构造函数中使用swap时,它会提示Id的默认构造函数被删除。我以为swap不是构造任何新对象,而只是交换两个项目的地址。我是不是误会了,它实际上是在创建Id的第三个临时实例??如果是这种情况,实现下面的move构造函数的最佳方法是什么?我在下面包含了一个

c++ - 为什么我不能有一个纯虚拟赋值运算符?

我有点迷失在C++运算符中。我想为两个不同的类强制执行赋值运算符,即一个可以相互分配一个:classA{public:virtualA&operator=(constA&a)=0;};classB:publicA{public:virtualA&operator=(constA&a)override{std::cout第一个任务似乎完成了任务,调用了“B”。同样,对于“c=b”,调用“C”。但是,当我取消注释第二部分时,出现链接器错误。如果我像这样定义A的运算符:virtualA&operator=(constA&a){std::cout我得到“B”、“A”。嗯?有人可以解释为什么在分

c++ - 为什么作为返回类型的右值引用不能初始化非常量引用?

我读了this问题,我知道右值引用是左值。然而,对于这段代码,例子1,int&&fun(){return1;}intmain(){int&a=fun();}当我编译它时:error:invalidinitializationofnon-constreferenceoftype'int&'fromanrvalueoftype'int'所以C++编译器告诉我fun的返回类型是右值。右值引用如何变成右值?我认为编译器应该以相同的方式对待左值引用和右值引用,但是这段代码,示例2,int&fun(){intb;returnb;}intmain(){int&a=fun();}可以编译(尽管如此,我

c++ - 为什么我不能推断静态成员函数是否存在

我有以下代码:#includetemplatestructfunc_impl;templateconstexprinlineboolhas_func=false;templateconstexprinlineboolhas_func::apply(std::declval()))>=true;templatestructfunc_impl{staticintapply(inti);};static_assert(has_func);static_assert失败了,而我预计它会成功。我做错了什么? 最佳答案 问题是第二个模板参数的默

c++ - 为什么不能使用 constexpr 全局变量来初始化 constexpr 引用类型?

#includeusingnamespacestd;constexprintr=100;intmain(){constexprint&k=r;cout编译此代码会在编译时出现“错误:将‘constint’绑定(bind)到‘int&’类型的引用会丢弃限定符”。 最佳答案 编译时在int后加入constconstexprintconst&k=r;//...........^^^^^问题是constepxr隐含了const,所以当你定义rconstexprintr=100;您将constexpr定义为intconst值(还要考虑cons

c++ - 为什么在使用命名空间 foo 时不能在 sub::bar 中使用 foo::bar 函数?

考虑以下程序:namespacefoo{namespacesub{intf();}//namespacesub}//namespacefoonamespacebar{namespacesub{intg(){usingnamespacefoo;returnsub::f()+1;}}//namespacesub}//namespacebar我希望它能编译,但它没有:$g++-6-ca.cppa.cpp:Infunction‘intbar::sub::g()’:a.cpp:12:9:error:‘f’isnotamemberof‘bar::sub’returnsub::f()+1;^~~a.

c++ - 为什么我不能将此对象推送到我的 std::list 中?

刚开始用C++编程。我创建了一个Point类、一个std::list和一个迭代器,如下所示:classPoint{public:intx,y;Point(intx1,inty1){x=x1;y=y1;}};std::listpointList;std::list::iteratoriter;然后我将新点推送到pointList。现在,我需要遍历pointList中的所有点,所以我需要使用迭代器进行循环。这就是我搞砸的地方。for(iter=pointList.begin();iter!=pointList.end();iter++){PointcurrentPoint=*iter;gl

c++ - 不能出现在常量表达式中

在下面的c++程序中:staticconstintrow=(dynamic_cast(log(BHR_LEN*G_PHT_COUNT)/log(2)));staticconstintpht_bits=((32*1024)/(G_PHT_COUNT*G_PHT_COUNT*BHR_LEN));unsignedchartab[pht_bits][1我收到错误消息doublelog(double)'cannotappearinaconstant-expression。为什么我会遇到这个问题,因为我在前面放了一个整数?我应该如何解决这个问题? 最佳答案