草庐IT

-std=gnu99

全部标签

c++ - 可以在构造时修改命名的 std::string 吗?

有谁知道为什么注释行编译失败但未注释行没问题?#includeintmain(){//std::stringfoo("hello").erase(2);//Thisdoesn'tcompile...std::string("hello").erase(2);//...butthisdoes.}包含注释行会导致此错误:main.cpp:Infunction‘intmain()’:main.cpp:5:error:expected‘,’or‘;’before‘.’token谁能解释一下在构造匿名std::string对象时修改匿名对象和命名对象的规则是什么? 最

c++ - 为什么 std::unique_ptr 没有 const get 方法?

我知道std::unique_ptr是这样的,可能不会改变以破坏向后兼容性,但我想知道是否有人有充分的理由说明规范的作者没有这样做'用看起来像这样的const变体重载get方法constT*get()const;遵循unique_ptr为const的意图。我最好的猜测是它试图镜像指针并像T*const而不是典型的类。作为后续问题,如果我想在类的const实例中以类似const的方式保存指针,我是否应该使用std::unique_ptr以外的其他东西来保存数据?更新在我的例子中,我想保护自己不在类本身中滥用指针。我正在编写一个const移动构造函数MyClass(constMyClass

c++ - 移动后是否需要重置 std::list?

我有以下代码:std::listsome_data;...std::listnew_data=std::move(some_data);some_data.clear();...问题是some_data.clear()是否有必要?(备案,some_data以后会重复使用) 最佳答案 是的,这是必要的。只有std智能指针在移动后保证处于默认构造状态。容器处于有效但未指定的状态。这意味着您只能在没有前提条件的情况下调用成员函数,例如clear,将对象置于完全已知的状态。 关于c++-移动后是

c++ - 如何编写正确的 std::initializer_list 构造函数

考虑以下代码:#include#includestructC{std::vectora;std::stringb;boolc;};voidprintC(constC&c){//...}intmain(){printC({{1,2,3},"ehlo",false});}这行得通,因为编译器可以为我生成合适的构造函数。但是,如果我将结构C更改为:structC{std::vectora;std::stringb;boolc;C(){c=false;}};printC调用停止工作,因为编译器停止生成适当的构造函数。我尝试使用std::initializer_list为自己编写一个构造函数,但

c++ - std::holds_alternative 可变参数模板

是否可以将std::holds_alternative包装到可变参数模板中以将其用于更多类型?例如:std::variantvar=4;boolr=std::holds_alternative(var);//holdseitherboolordouble 最佳答案 是的,用一个简单的折叠表达式就可以做到。templateconstexprboolholds_any_of(std::variantconst&v)noexcept{return(std::holds_alternative(v)||...);}

c++ - std::stringstream 如何处理 operator<< 中的 wchar_t*?

鉴于以下代码段无法编译:std::stringstreamss;ss我也不认为这个会:std::stringstreamss;ss但确实如此(至少在VC++上)。我猜这是由于以下ostream::operator过载:ostream&operator如果我不小心混合了字符类型,这是否有可能悄悄地破坏我的代码? 最佳答案 是的-您需要wstringstream用于wchar_t输出。您可以通过不使用字符串文字来缓解这种情况。如您所述,如果您尝试将constwstring&传递给stringstream,它将无法编译。

c++ - 使用默认构造函数初始化 std::vector

我有一个类字段,它是一个std::vector。我知道我希望这个vector包含多少个元素:N。如何用N个元素初始化vector? 最佳答案 std::vector有一个构造函数声明为:vector(size_typeN,constT&x=T());您可以使用它来构造包含N个x拷贝的std::vector。x的默认值是初始化值T(如果T是具有默认构造函数的类类型,则值初始化是默认构造)。使用此构造函数初始化std::vector数据成员非常简单:structS{std::vectorx;S():x(15){}}

c++ - 使用 std::tm 作为 std::map 中的键

我想使用std::tm()作为std::map容器的键。但是当我尝试编译它时,出现了很多(10)个错误。例如:1.errorC2784:'boolstd::operator&,const_Elem*)':couldnotdeducetemplateargumentfor'conststd::basic_string&'from'consttm'c:\programfiles(x86)\microsoftvisualstudio10.0\vc\include\xfunctional1252.errorC2784:'boolstd::operator&)':couldnotdeducete

c++ - std::string 赋值的正确用法

从constchar*构造std::string时,我经常使用以下模式:constchar*p=GetString();std::strings(p);我想我可以使用类似的模式:constchar*p=GetString();std::strings=p;但是,当我想从constchar*赋值给std::string而不是构造时,我有太多选择:s=p;s.assign(p);std::string(p).swap(s);以上选择是否大致相同?我应该更喜欢哪个,为什么? 最佳答案 为了可读性,只需使用惯用的operator=进行赋值。

c++ - 为什么在 for 循环中使用 std::for_each?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Advantagesofstd::for_eachoverforloop所以我在尝试一些C++11特性,我很好奇为什么std::for_each是有益的。做一个for循环会不会更容易,看起来更干净,还是因为我已经习惯了这样做?#include#include#include#includetypedefstd::tuplepow_tuple;pow_tuplepow(intx){returnstd::make_tuple(x,x*x);}voidprint_values(pow_tuplevalues){st