草庐IT

-std=gnu99

全部标签

c++ - 右值 lambda 的 std::reference_wrapper 如何工作?

在thisarticle它说以下代码是有效的C++11并且适用于GNU的libstdc++:intn;std::vectorv;...std::functionf(std::cref([n](inti){returni%n==0));std::count_if(v.begin(),v.end(),f);问题是我始终相信lambda对象是在调用站点创建的,这将使它成为此代码段中的临时对象,因为它没有存储在任何变量中,而是存储在const中。正在创建对它的引用并将其传递给std::function.如果是这样,lambda对象应该一直被销毁,在f中留下悬空引用。,当std::count_i

c++ - 为什么 std::string 没有标准定义的文字后缀?

一个简单的问题:为什么C++11不提供“用户”(实际上是标准库)定义的文字来创建std::string,例如autostr="helloworld"s;//strisastd::string与C++一样,Objective-C既支持C风格的字符串,也支持对用户更友好的库类型NSString;然而,与C++不同的是,没有人会混淆两者,因为通过在字符串文字前加上@来创建NSString是微不足道的。事实上,很少看到Objective-C代码的文字没有有@前缀。每个人都知道这样做的方式,使用NSString并继续使用它。C++11用户定义文字允许这样做,事实上Stroustrup的C++11

c++ - std::exception 的 what() 返回 "std::exception"

这里的Java人一直在做一些C++。我正在捕获一个异常并试图诊断它来自哪里(遗憾的是当通过gdb运行时没有抛出异常)。但是,当我打印出异常的what()时,我只是得到字符串“std::exception”。这是特定于标准库中的任何东西还是很多标准异常都返回这个?这是我要打印的内容:}catch(conststd::exception&ex){std::cout输出只是:std::exception另外,我在一个相当大的代码库中工作,这可能是我们这边的一些异常,但我还没有通过常规搜索技术找到它,所以我目前倾向于这个即将到来的来自标准库。如果相关的话,我正在使用g++4.8。

c++ - 如何正确使用 std::atomic_signal_fence()?

cppreference.com将此函数记录为“线程与在同一线程中执行的信号处理程序之间的栅栏”。但是网上没找到例子。我想知道以下伪代码是否正确说明了std::atomic_signal_fence()的功能:intn=0;SignalObjects;voidthread_1(){s.wait();std::atomic_signal_fence(std::memory_order_acquire);assert(1==n);//neverfires???}voidthread_2(){n=1;s.signal();}intmain(){std::threadt1(thread_1);

c++ - 对于构造函数,我如何在可变参数模板与 std::initializer_list 之间进行选择?

在c++11的当前状态下(比如gcc4.7.2),我应该如何选择使用variadic-template或std::initializer_list我什么时候需要一个可以接受可变参数的构造函数? 最佳答案 可变参数模板允许您提供不同类型的参数,而std::initializer_list是用参数类型模板化的。这意味着列表中所有元素的类型必须相同(或可转换为基础类型,但不允许缩小转换)。根据这是否适合您,您可以选择其中之一。此外,如果您需要完美转发,可变参数模板通常是默认选择,因为语法形式T&&可以绑定(bind)到左值引用和右值引用,

c++ - 为什么以 std::placeholders::_1 而不是 _0 开头?

C++中的大部分内容都是基于0的,而不是基于1的。出于好奇,为什么占位符是基于1的?意思是_1是第一个参数,而不是_0。 最佳答案 因为boost::bind就是这样做的,而Boost.Bind作者编写了将其添加到TR1的提案,并被复制到标准中。至于为什么Boost.Bind这样做,我不知道,但我敢猜测它可能是为了匹配std::bind1st和std::bind2nd来自1998年的标准,来自STL。在这种情况下,“第一”即“第一”是正确的(即使在基于零的索引系统中,索引为零的项目也是第一个,而不是第零项目。)所以也许占位符应该是_

c++ - 使用 g++ 4.8 时缺少 std::vector::erase() 的 const_iterator 重载

followingexample不会使用g++4.8.2编译:#include#includeusingnamespacestd;intmain(){vectorv{1,2,3};v.erase(v.cbegin());//Compilercomplainsreturn0;}编译器说了以下内容。(它不是很可读,但它提示vector::const_iterator和vector::iterator之间没有已知的转换。)prog.cpp:Infunction‘intmain()’:prog.cpp:8:20:error:nomatchingfunctionforcallto‘std::ve

c++ - 如何将 std::vector::emplace_back 用于 vector<vector<int>>?

vector>res;res.emplace_back({1,2});//changetores.push_back({1,2});wouldwork这给我错误main.cpp:61:25:error:nomatchingfunctionforcallto‘std::vector>::emplace_back()’main.cpp:61:25:note:candidateis:Infileincludedfrom/usr/include/c++/4.7/vector:70:0,from/usr/include/c++/4.7/bits/random.h:34,from/usr/incl

c++ - 使用带有 std::string 键和 int 键的 std::map 的成本?

我知道单个map查询最多需要log(N)时间。但是我想知道,我已经看到很多使用字符串作为映射键的示例。例如,将std::string作为键关联到映射而不是int的性能成本是多少?std::mapsomeMap;对比std::mapsomeMap;谢谢! 最佳答案 分析算法的渐近性能正在研究必须执行的操作以及它们添加到等式中的成本。为此,您需要首先了解执行的操作是什么,然后评估其成本。在平衡二叉树(映射恰好是)中搜索键需要O(logN)复杂的操作。这些操作中的每一个都意味着比较匹配的键,如果键不匹配则跟随适当的指针(子指针)。这意味着

c++ - 为什么 std::uint32_t 与 uint32_t 不同?

我对c++有点陌生,我有一个编码任务,其中有很多文件已经完成,但我注意到VS2012似乎有以下语句的问题:typedefstd::uint32_t标识符;但是,似乎将其更改为typedefuint32_t标识符;消除错误。没有包含,这是在头文件中。我注意到定义在stdint.h中。如果是这样,为什么这段代码在VS之外是可以接受的(即使用g++正确编译)但在VS中是NotAcceptable?谁能解释一下? 最佳答案 区别在于一个在命名空间内,另一个不在。否则它们应该是相同的。第一个应该是C版本,第二个是C++版本。在C++11之前,