草庐IT

c++ - size_t 数据类型可以安全地用于 str.find() 吗?

我一直在查看字符串的find()函数的代码,它们将结果存储在数据类型为size_t的变量中。然而,据我所知,size_t是一个无符号整数,如果find()没有找到预期的字符串,它会返回-1。例如,如果我有strings="asdf";size_ti=s.find("g")cout它给我4294967295。但是,如果我用int数据类型替换size_t,它会给我-1。奇怪的是,当我像这样进行比较时strings="asdf";size_ti=s.find("g")if(i==-1){do_something;}无论i是size_t还是int都有效。那我用哪个?int还是size_t?

c++ - `type *var = (int)0` ,合法与否?

下面的例子:char*var=(int)0;在gcc和cl.exe上编译,但在clang中导致错误:cannotinitializeavariableoftype'char*'withanrvalueoftype'int'谁是正确的?对于它的值(value),C++11说(强调我的)4.10/1Anullpointerconstantisanintegralconstantexpression(5.19)prvalueofintegertypethatevaluatestozerooraprvalueoftypestd::nullptr_t.Anullpointerconstantca

c++ - 在不丢失信息的情况下将 double 转换为 int64_t 并返回

这个问题可能有人问过,但我搜索过,找不到答案。我正在实现一个玩具虚拟机,其中OpCodes采用以下形式:std::tuple//instructionop1,op2我正在尝试将一个double值打包到其中一个操作数中,并在处理它时再次读回它。这不能可靠地工作。doubled=...autoa=static_cast(d);autob=static_cast(a)//sometimes,b!=d有没有办法将double的位表示打包成int64_t,然后读回该位模式以获得与以前完全相同的double? 最佳答案 static_cast执

c++ - 使用 Int 的初始化列表初始化 Long Double 的 vector

假设我有一个简单的类:classPvector{private:std::vectorpoint_list;public:Pvector(std::initializer_listcoords):point_list(coords){}Pvector(std::initializer_listcoords):point_list(coords){}};这将无法编译,因为longdouble模板化的std::vector无法从int类型模板化的初始化列表中初始化自身.然而,这很不方便,因为删除了第二个构造函数后,我无法在我的代码中执行以下操作:Pvectorpiece_movement(

c++ - 用 stoi 声明的 Const Int 不被认为是 const

我使用CGAL编写了一个简单的测试程序,遇到了以下问题:点在上面定义为typedefK::Point_dPoint;但我认为这无关紧要。当我尝试按如下方式编译程序时:constintsize=10;PointP[size];g++这样做没有问题。如果我尝试编译:constintsize=stoi("10");PointP[size]出现以下错误error:variablelengtharrayofnon-PODelementtype'Point'(aka'Point_d>>>')为什么在从字符串中检索时将大小视为变量而不是常量? 最佳答案

c++ - 为什么调用 `int* Get()` 而不是 `const int& Get()` ?

我有一个B类,它有两个方法,一个返回指向成员变量的指针,另一个返回对该变量的常量引用。我尝试调用这些方法。在调用期间,我将返回值存储到相应的返回类型。我期望适当的返回类型最终会调用适当的方法,但我收到一个编译错误:error:invalidconversionfrom‘int*’to‘int’[-fpermissive]constint&refval2=b.Get();`Hereismycode:#includeclassB{public:int*Get(){return&x_;}constint&Get()const{returnx_;}private:intx_=0;};intma

c++ - 在不使用 std 的情况下如何使用 int32_t?

这是我的代码:#includeintmain(){int32_ti=5;std::cout这是输出:$clang++-std=c++11-pedantic-Wall-Wextrafoo.cpp&&./a.outi:5这是我的问题:C++标准似乎在std命名空间内的cstdint中定义了int32_t。在我的代码中,我既没有包含cstdint也没有使用std命名空间。为什么编译器不报错? 最佳答案 名字int32_t也出现在C库头文件的全局范围内stdint.h.这可能使它在C++中也全局可见。本节[Headers]说:...thec

c++ - 当字符串保存在一个集合中时,c_str() 是否仍然有效

我有一个旧项目需要维护,其中使用了constchar*。出于某种原因,我想保留大量运行时生成的字符串。所以我创建了一个全局变量std::set来保存这些字符串。当生成新字符串时,除了添加到集合中外,我还会返回并发送newString.c_str(),它将保存在其他地方。例如。std::setg_stringDB;voidArchieveString(AStruct*container,constchar*temporaryString){autoit=g_stringDB.emplace(temporaryString);container->validString=it->first

c++ - 我需要将 strtol 的结果转换为 int 吗?

以下代码在g++4.1.1和-Wall中不会给出警告。intoctalStrToInt(conststd::string&s){returnstrtol(s.c_str(),0,8);}我原以为会收到警告,因为strtol返回一个longint,但我的函数只返回一个普通的int。其他编译器可能会在这里发出警告吗?在这种情况下,我是否应该将返回值转换为int作为一种好的做法? 最佳答案 最好的方法是:longx=strtol(...);assert(x你需要limits.h和assert.h

c++ - 奇怪的错误 : cannot convert from 'int' to 'ios_base::openmode'

我正在使用g++编译一些代码。我写了以下片段:boolWriteAccess=true;stringName="my_file.txt";ofstreamFile;ios_base::open_modeMode=std::ios_base::in|std::ios_base::binary;if(WriteAccess)Mode|=std::ios_base::out|std::ios_base::trunc;File.open(Name.data(),Mode);我收到这些错误...知道为什么吗?错误1:从“int”到“std::_Ios_Openmode”的无效转换错误2:初始化'