草庐IT

-std=gnu99

全部标签

c++ - 前向声明类型上的 std::vector

以下代码似乎可以在Clang++和GCC上正常工作:#includeclassA{private:inti;std::vectorchildren;public:A&add();};A&A::add(){children.emplace_back();returnchildren.back();}intmain(){Aa;A&a2=a.add();}当数据成员std::vector已声明,A仍然是一个不完整的类型。使用std::vector时相同和B仅使用classB;向前声明.它应该与std::vector一起使用因为它只包含一个指向-A的指针.这是保证有效,还是未定义的行为?

c++ - std::function -> 函数指针

代码如下:#includeusingnamespacestd::tr1;typedefvoid(*fp)(void);voidfoo(void){}voidf(fp){}intmain(){functionfun=foo;f(fun);//errorf(foo);//ok}最初我需要从非静态类方法创建一个函数指针,因为我需要在函数调用之间保存数据。我尝试了std::tr1::bind和boost::bind,但它们返回的是功能对象,而不是指针,正如我所见,这不能是“类型转换”到纯功能指针。而函数签名(SetupIterateCabinet)恰恰需要一个纯函数指针。我需要一个解决问题的建

c++ - std::common_type 实现

为了了解它是如何工作的,我查看了标题type_traits中std::common_type的libstdc++实现。我不得不承认我并不真正理解它是如何工作的。在这里:///common_typetemplatestructcommon_type;templatestructcommon_type{typedef_Tptype;};templatestructcommon_type{typedefdecltype(true?declval():declval())type;};templatestructcommon_type{typedeftypenamecommon_type::t

c++ - std::unordered_map::emplace 问题与私有(private)/删除的复制构造函数

以下代码可以在gcc4.7.2(mingw)中正常编译#include#includestructtest{test()=default;private:test(testconst&)=delete;};intmain(){std::unordered_mapmap;map.emplace(std::piecewise_construct,std::forward_as_tuple('a'),std::forward_as_tuple());}如果我将test中的复制构造函数从test(testconst&)=delete;更改为test(testconst&)=default;但是

c++ - 确定 if::std::numeric_limits<T> 是否可以安全实例化

类模板::std::numeric_limits只能为类型实例化T,它可以是函数的返回值,因为它总是定义像staticconstexprTmin()noexcept{returnT();}这样的成员函数(有关c++03或c++11中非专用版本的更多信息,请参阅http://www.cplusplus.com/reference/limits/numeric_limits/)。如果T即int[2]实例化将立即导致编译时错误,因为int[2]不能是函数的返回值。包装::std::numeric_limits使用安全版本很容易-如果有一种方法可以确定实例化是否安全::std::numeric

c++ - 为什么 std::make_tuple 将 std::reference_wrapper<X> 参数转换为 X&?

在C++11标准中它声明(参见cppreference.com,另请参见标准的第20.4.2.4节)它声明templatetuplemake_tuple(Types&&...args);Createsatupleobject,deducingthetargettypefromthetypesofarguments.ForeachTiinTypes...,thecorrespondingtypeViinVtypes...isstd::decay::typeunlessapplicationofstd::decayresultsinstd::reference_wrapperforsome

c++ - 从 std::istreambuf_iterator 创建 std::string,奇怪的语法怪癖

我在某处发现了以下用于将文件读入字符串的习语:std::ifstreamfile("path/to/some/file.ext");std::stringcontents(std::istreambuf_iterator(file),(std::istreambuf_iterator()));它现在工作得很好。但是,如果我删除第二个迭代器参数周围的括号,即:std::stringcontents(std::istreambuf_iterator(file),std::istreambuf_iterator());一旦我尝试在字符串对象上调用任何方法,例如:constchar*buffe

c++ - 错误 : no type named 'vector' in namespace 'std'

为什么会这样?error:notypenamed'vector'innamespace'std';didyoumean'hecto'?voidaskForVector(std::vector*vector);#include#includevoidaskForVector(std::vector*vector);intmain(){std::vectorvector;intsize;askForVector(&vector);std::cout>size;vector->resize(size);for(inti=0;i>vector[i];}for(intj:*vector)std:

c++ - 在 lambda C++14 中捕获 std::promise

我想制作一个状态机,它可以在自己的线程中处理提交的信号。我使用VisualStudio2015,因此支持C++11和部分C++14。信号存储在容器中。每个信号都表示为一个std::function。我想从客户端等待状态机处理提交的信号,所以它是一种同步信号。我的问题是:我无法将std::promise捕获到lambda中并将其添加到容器中。#include#include#includestd::list>callbacks;voidaddToCallbacks(std::function&&callback){callbacks.push_back(std::move(callbac

c++ - std::atomic 的默认值是多少?

我发现在实践中,对于各种C++11/C++14编译器,std::atomic有一个未定义的初始值,就像它是一个"生”类型。也就是说,我们期望对于表达式inta;a可以有任何值。对于表达式std::atomicb;b也可以有任何值。换句话说,std::atomicb;//bisundefined不等于std::atomicb{0};//b==0或到std::atomicb{};//b==0因为在后两种情况下,b被初始化为一个已知值。我的问题很简单:在C++11或C++14规范中的什么地方记录了这种行为? 最佳答案 [atomics.t