草庐IT

-std=gnu99

全部标签

c++ - 为什么在 gcc 中允许带有 std::string 的模板化 constexpr?

为什么gcc允许编译模板版本?它是编译器错误还是与模板一起使用时实际上有效?有人可以给我解释一下吗?它不能在clang或godbolt.org上使用的其他编译器上编译。编译错误是由在constexpr中使用的字符串和字符串流产生的。#include#include#includetemplateconstexprstd::stringfunc1(Ta,Tb)//Compilesandruns{std::stringstreamss;ss 最佳答案 GCC可能就在这里。根据dcl.constexpr第6段:Iftheinstantia

c++ - 从 std::vector 中过滤掉元素的有效方法

为了从std::vector中过滤掉一些坏元素,我最终使用了以下代码:#include#include#includetypedefstructmystruct{intid;std::stringname;};intmain(){std::vectorall_items={{151,"test1"},{154,"test4"},{152,"test2"},{151,"test1"},{151,"test1"},{153,"test3"}};std::vectorbad_ids={151,152};std::vectorfilter_items;for(constauto&item:al

c++ - 为什么 std::in_place_t 的构造函数是默认和显式的?

cppreference显示了std::in_place_t的以下定义:structin_place_t{explicitin_place_t()=default;};inlineconstexprstd::in_place_tin_place{};为什么他们添加了一个显式和默认构造函数?为什么它没有被排除在外?有什么好处? 最佳答案 您希望这样的类型只能显式构造,因为它的存在是为了表示一种特定类型的构造函数重载,在{}可能合理的地方成立。考虑以下结构std::optionaldc1({});//dc1==std::nullopts

c++ - std::make_shared 和 std::make_unique 有 "nothrow"版本吗?

对于new运算符,我们有std::nothrow版本:std::unique_ptrp=new(std::nothrow)T();std::make_shared或std::make_unique有这样的东西吗? 最佳答案 不,我们没有。查看make_unique的cppreference页面和make_shared,我们看到每个版本都使用默认的new重载。实现一个并不难,但是,像这样:templatestd::unique_ptrmake_unique_nothrow(Args&&...args)noexcept(noexcept

c++ - 自 C++17 的类模板参数推导以来,std::make_move_iterator 是否多余?

从C++11开始,要将一些vectory附加到另一个vectorx,您可以这样做:x.insert(x.end(),std::make_move_iterator(y.begin()),std::make_move_iterator(y.end()));使用C++17类模板参数推导,可以更简洁地编写此代码:x.insert(x.end(),std::move_iterator(y.begin()),std::move_iterator(y.end()));从C++17开始,这不会使std::make_move_iterator变得多余吗?std::make_move_iterator(

c++ - msvc/permissive- std::string 重载运算符 '=' 不明确

它用/permissive编译,但用/permissive-编译失败。什么不符合要求以及如何解决?为什么在(2)中没问题,但在(4)(3)中失败了?如果我删除operatorlong也可以。如何在不更改调用站点(3,4)的情况下修复它?#includestructmy{std::stringmyVal;my(std::stringval):myVal(val){}operatorstd::string(){returnmyVal;};operatorlong(){returnstd::stol(myVal);};};intmain(){structMyStruct{longn=my("

c++ - std::copy/memcpy/memmove 优化

我查看了GCCSTL(4.6.1)并看到了std::copy()使用优化版本以防内置__is_trivial()评估为true.自std::copy()和std::reverse_copy()模板对于复制数组中的元素非常有用,我想使用它们。但是,我有一些类型(它们是模板实例化的结果)是包含一些微不足道的值、没有指针并且没有复制构造函数或赋值运算符的结构。G++是否足够聪明,可以弄清楚我的类型实际上是微不足道的?在C++98中有没有什么方法可以确保STL实现知道我的类型是微不足道的?我想在C++11中,使用is_trivial会变得很方便类型特征。这样对吗?谢谢!编辑:抱歉来得太晚了,但

c++ - 为 std::tuple 重载运算符 << - 可能的简化?

我用了ananswertotheSOquestion"iterateovertuple"编写一个方法来重载.此方法已经过测试,似乎可以与g++4.7一起正常工作。在Debian挤压上。然而,这种方法有点迂回,因为看起来不能显式实例化(我找到了一篇关于它的帖子here).因此,人们被迫定义一个字符串方法然后调用它。vector我有类似的方法,比较直接。有没有人对如何消除使用相同方法或其他方式创建字符串方法的额外步骤提出建议?提前致谢。#include#include#include#include#includeusingstd::ostream;usingstd::cout;using

c++ - 我怎样才能避免编译器错误:std::transform?

这是我的C++代码(我使用的是VisualC++2010):intabsd(intt){returnabs(t);}intmain(){try{intdpi=137;intdpiCriterionAry[]={100,150,200,300,400,500,600};std::vectorvec(dpiCriterionAry,dpiCriterionAry+_countof(dpiCriterionAry));std::transform(vec.begin(),vec.end(),vec.begin(),std::bind1st(std::minus(),dpi));std::tr

c++ - 从重载函数 std::real<float> 解析地址

std::vector>c;std::vectord;std::transform(c.begin(),c.end(),d.begin(),std::real);为什么编译器无法解析来自重载函数的地址real?编译器指的是哪些重载函数? 最佳答案 您的库实现为std::real提供了额外的重载.为什么会重载?26.4.9Additionaloverloads[cmplx.over]1Thefollowingfunctiontemplatesshallhaveadditionaloverloads:argnormconjprojima