草庐IT

c++ - C++ 临时对象的生命周期是在什么时候创建的? : expression extended by binding it to a local const reference?

我不清楚是否可以通过将临时对象绑定(bind)到?:表达式中的常量引用来延长临时对象的生命周期:classFoo{...};Foo*someLValue=...;constFoo&=someLValue?*someLValue:Foo();通过调用默认构造函数Foo()创建的临时对象的生命周期是否通过将其绑定(bind)到本地constref来延长,即使绑定(bind)是有条件的?还是因为Foo()的临时值会在?:表达式的末尾被销毁,所以这会创建一个悬空引用? 最佳答案 在此代码中,条件运算符的第二个和第三个操作数具有不同的值类别(

c++ - 主线程中 block 作用域静态与命名空间作用域 thread_local 的初始化和销毁​​顺序

我正在尝试了解在主线程的上下文中使用静态存储持续时间和线程本地存储持续时间来初始化和销毁​​命名空间范围和block范围对象的顺序规则。考虑这两个类:structFoo{Foo(){std::cout除了它们的静态实例成员函数的实现之外,它们是相同的:thread_localFoot_foo;Foo&Foo::instance(){returnt_foo;}Bar&Bar::instance(){staticBars_bar;returns_bar;}Bar是一个Meyers单例,一个具有静态存储持续时间的block范围对象。Foo的实例是具有线程本地存储持续时间的namespace范

c++ - "vtable"链接器错误(涉及带有 "=default"的虚拟析构函数)- Clang 3.1 中的潜在错误?

我的代码中出现链接器错误。我已将其精确定位为以下最基本的要点。这段代码给出了链接器错误"vtableforFoo",referencedfrom:Foo::Foo()classFoo{public:Foo();virtual~Foo()=default;};Foo::Foo(){}但是这段代码没有给出任何错误:classFoo{public:Foo();virtual~Foo(){}};Foo::Foo(){}为什么?我认为=default基本上应该和那些空方括号做同样的事情。更新:我正在使用“AppleLLVM编译器4.1”,它是Xcode4.5.2的一部分。这可能是这个编译器中的错

c++ - 修改常量对象

我正在查看初级C++开发人员职位的面试问题。问题是(引用):Isthefollowingcodecorrect?structFoo{inti;voidfoo(void)const{Foo*pointer=const_cast(this);pointer->i=0;}};我会回答:ThecodeitselfisvalidaccordingtotheC++03andc++11standardsandwillcompilesuccessfully.Butitmayinvokeanundefinedbehaviorduringassignmentpointer->i=0;iftheinstan

c++ - 如何在类 noexcept 之外定义默认构造函数?

我知道标记为=default的构造函数将尽可能“尝试”为noexcept。但是,如果我在类的外部定义它,它就不再是noexcept,您可以从这段代码中看到:#include#include#includestructBar{Bar()=default;Bar(Bar&&)=default;//noexcept};structFoo{Foo()=default;Foo(Foo&&);};//movingthedefinitionoutsidemakesitnoexcept(false)Foo::Foo(Foo&&)=default;//notnoexceptanymoreintmain(

c++ - 我可以使用 foo<T..., int, U...> 这样的模式部分特化模板吗?

如果可能的话,可以在不递归的情况下索引可变参数模板参数包。但是,GCC是refusingtopickupmypartialspecialization这里:templatestructelement_impl;templatestructelement_impl...,pair,pair...>>{typedefTtype;};prog.cpp:Ininstantiationof'element>':prog.cpp:52:34:instantiatedfromhereprog.cpp:47:79:error:invaliduseofincompletetype'structeleme

c++ - gmock 支持右值引用的解决方法

gmock不支持将右值引用作为模拟函数的参数(issuereport)。例如下面的代码将不会编译:MOCK_METHOD1(foo,void(std::string&&));我找不到有关gmock何时为此添加支持的信息。 最佳答案 我想出了一个解决方法:使用非模拟函数foo(std::string&&s){foo_rvr(s)}将函数中继到模拟函数foo_rvr(std::字符串)。这是完整的程序。#include#include#includeclassRvalueRef{public:virtualvoidfoo(constst

c++ - std::vector<Foo> 当 Foo 的一些成员是引用时

只要有可能,我通常更喜欢使用引用而不是指针,在我看来,它使语法更清晰。在这种情况下,我有一个类:classFoo{public:Foo(Bar&bar):bar_(bar){}private:Bar&bar_;};operator=()被编译器隐含地删除了这样一个类,因为一旦设置了引用,它就不能改变(我可以在技术上定义我自己的不改变bar_,但这不是必需的行为,所以我宁愿如果我尝试分配一个foo,编译器会提示)。我需要的是std::vectorv;.这在C++11之前是不可能的,因为模板参数必须是CopyAssignable。事实上,当我调用v.push_back(Foo(bar));

c++ - 在 C++ 中将一个字符串值赋给一个整型变量会发生什么?

我刚开始学习C++(请原谅我的菜鸟问题)。这是我作为练习编写的一些代码:#includeintmain(){usingnamespacestd;intfoo;cin>>foo;intbar;cin>>bar;cout现在,当两个输入都是数字时,这段代码工作得很好。但是当我为第一个输入输入一个字符串时(只是为了看看会发生什么)程序不会要求我输入第二个输入并且cout结果是fooplusbaris0。我想知道的是,当我将一个字符串分配给一个整型变量时,为什么程序会跳过我的第二个cin。感谢您的帮助。 最佳答案 一个流有一个内部状态。如果

c++ - 为什么我不能将 this 指针显式传递给成员函数?

C++标准(ISOc++11)在第9.3.1节中提到Anon-staticmemberfunctionmaybecalledforanobjectofitsclasstype,orforanobjectofaclassderived(Clause10)fromitsclasstype,usingtheclassmemberaccesssyntax(5.2.5,13.3.1.1).尝试使用g++(版本4.8.2)编译此代码classfoo{public:voidbar(){cout给出编译时错误,因为它无法匹配函数的签名。考虑到标准关于调用成员函数的规定,我想这是意料之中的。由于该方法在