我想知道是否可以通过仅访问容器内的对象来获得容器内对象的迭代器(例如std::vector),例如通过引用(这意味着我们可以使用&运算符访问指向它的指针)。例如,通常我们将迭代器声明为std::vector::iterator=vec.begin();或std::vector::iterator=next(vec.begin(),idx);但在第一个示例中,我们很可能要按顺序遍历容器,而在第二个示例中,我们知道所需对象的索引。我想知道我们是否可以在不知道对象驻留在容器中的哪个索引的情况下获得对象的迭代器,但如果我们确实有一个引用或指向它的指针,如上所述。似乎已经有人问过这个问题了her
我需要std::list中最后两个元素的别名。最后一个很简单(.back()),但是我应该如何得到它之前的那个呢?我的第一个想法是:在最后一个元素(.end())之后获取一个迭代器,并将它向左移动两次。这是我“制作”的内容:&last_but_one=*----myList.end(),虽然它有效,但我个人觉得它有点模糊,如果我在别人的代码中看到它,我认为我不会轻易解析它1。通读thisanswer显示了一些其他(过于)冗长的方法2:autoiter=n.end();std::advance(iter,-2);&last_but_one=*iter;//thisisoverkill!/
我曾多次尝试这样编写代码:structFoo{doubleconst&f;Foo(doubleconst&fx):f(fx){printf("%f%f\n",fx,this->f);//125125}doubleGetF()const{returnf;}};intmain(){Foop(123.0+2.0);printf("%f\n",p.GetF());//0return0;}但它根本不会崩溃。我还使用valgrind来测试程序,但没有出现错误或警告。因此,我假设编译器自动生成了一段代码,将引用指向另一个隐藏变量。但我真的不确定。 最佳答案
我一直在处理包装在容器类中的引用。为什么以下代码是合法的并且看起来行为正确?#includeclassFoo{public:Foo(inti):i_(i){}inti_;};classFooWrapper{public:FooWrapper(Foo&foo):foo_(foo){}Foo&foo_;};intmain(intargc,char*argv[]){Foofoo(42);FooWrapperfw(foo);FooWrapperfw2=fw;std::cout在没有显式operator=的情况下,我相信C++会进行成员复制。因此,当我执行FooWrapperfw2=fw;时,这
考虑以下代码片段:structfoo{};templatestructimpl:F{impl(F&&f):F{std::move(f)}{}autoget(){return(*this)();}};templateautoreturner(X&&x){returnimpl{[&x]{returnx;}};//^~}intmain(){autox=returner(foo{}).get();}liveexampleonwandbox.org是否保证foo{}在returner(foo{}).get()表达式的整个持续时间内都有效?或者foo{}是否只对returner(foo{})有效,
给定以下代码,其中x是对已消失对象的悬空const引用,因此是未定义的行为。autoget_vec(){returnstd::vector{1,2,3,4,5};}constauto&x=get_vec().back();似乎GCC7.3、Clang6.0和MSVC都无法发出警告,即使启用了所有警告。有谁知道在这些情况下是否可以发出警告?在这些情况下,constauto&和auto&&之间有什么区别吗?请注意,如果back()将按值返回,则它不会是未定义行为,因为生命周期临时对象x已扩展为函数scoop。长话短说:我有一个代码库,其中constauto&被用作初始化变量的默认方式,出于
我一直在研究C++11中的右值引用加法。这并不简单,但我觉得我终于开始掌握它了。但是,有一个特定的例子让我感到困惑。具体来说,我不明白这个例子中“b”的含义是什么:inta=27;int&&b=27;编辑:我知道inta=27是左值而不是左值引用。此外,我寻找的不是int&&b=27是什么,而是直觉上它的含义是什么。我很困惑,因为我认为右值不可寻址,但这里我们有一个对右值的引用,这意味着我们可以寻址它。那么为什么它仍然是右值呢? 最佳答案 inta=27;是一个语句,既不是左值也不是右值。它定义了namea,它可以用作int类型的左
这个问题在这里已经有了答案:Defaultconstructorwithemptybrackets(9个回答)关闭7年前。考虑以下代码。在这里,即使构造函数是A(B&b),Aa(B())也会编译;但是print(B())不起作用。但是print也被声明为print(B&b);为什么会出现这种不一致?#includeusingnamespacestd;classB{public:charb;};classA{public:Bb;A(B&b);A(){}};A::A(B&b){this->b=b;}voidprint(B&b){}intmain(){print(B());Aa(B());}
我有这段代码Stack&Stack::operator=(constStack&stack){if(this==&stack){return*this}}我在这里定义了运算符=但我无法理解,如果我通过引用堆栈接收为什么它应该是&inthis==&stack而不是this==stack以及为什么我们在return*this而不是this中返回*谢谢提前寻求任何帮助 最佳答案 因为this是指针(即Stack*类型),而不是引用(即不是Stack&类型)。我们使用if(this==&stack)只是为了保证声明s=s;可以正确处理(特别
ClassA{A(int&foo):m_foo(foo){}int&m_foo;};intmain(void){A*bar=0;{intvar=5;bar=newA(var);}std::cout“m_foo”是引用,“var”是提供给构造函数的局部变量。“var”在打印值之前超出了范围,所以它是否使m_foo也无效?如果m_foo是一个指针,那么它是无效的,但它是否以与引用相同的方式工作? 最佳答案 当intvar超出范围时,m_foo无效。它所指的事物已经消失。 关于C++:类成员引