码
class A
{
public:
void f(const int i);
};
void A::f(int i)
{
std::cout<<++i<<std::endl;
}
int main()
{
A a;
a.f(1);
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器在这种情况下不会出错?为什么定义会覆盖常量参数?此外,当参数是类型时reference (&),编译器会抛出错误,但为什么不在这种情况下呢?
是否有任何编译器标志可以在这些提到的情况下启用警告?
我对编译器错误POV感兴趣.因为可以很容易地将声明(const)和定义(非常量)放在一起,但编译器仍然接受它.如果可以犯错误,最终会犯错误.当存在这样的差异时,为什么编译器不能抱怨.
据我所知,std::string_view是一个非所属参照字符串之间的主要差异std::string_view,并std::string有
现在,为什么std :: string_view不适用于其他类型?或者为什么这个实现仅适用于std::string?
例如:如果我们有类似的<T>generic_view地方T可以是任何类型,包括自定义类型.
有了这个,可以使用而不是使用const T& as函数参数<T>generic_view.而且其他优点std::string_view也很有用,如分配,复制等.
我的数据将存储在整数和整数的映射中.键是任何数字的start_range.值是end_range
例如,我的地图将如下所示:
std::map<int,int> mymap;
mymap[100]=200;
mymap[1000]=2000;
mymap[2000]=2500;
mymap[3000]=4000;
mymap[5000]=5100;
Run Code Online (Sandbox Code Playgroud)
现在,如果我的输入数字是150,那么算法应该将一个迭代器返回到mymap [100].但是,具有输出值(即迭代器 - >秒)的范围检查逻辑应单独完成,以验证它是否落在正确的范围内.
对于输入数字4500,它可能返回mymap [5000],但范围检查逻辑应该失败,因为它是从5000到5100.请注意地图中没有范围的OVERLAP.
我正在观察字符串操作的一些奇怪行为.
例如:
int main()
{
std::string name("ABCDEFGHIJ");
std::cout << "Hello, " << name << "!\n";
name.clear();
std::cout << "Hello, " << name << "!\n";
name.assign("ABCDEF",6);
std::cout << "Hello, " << name << "!\n";
std::cout << "Hello, " << name[8] << "!\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hello, ABCDEFGHIJ!
Hello, !
Hello, ABCDEF!
Hello, I!
Run Code Online (Sandbox Code Playgroud)
string :: clear实际上没有清除,因为即使清除后我也能访问数据.根据文档,当我们访问超出范围的东西时,结果是未定义的.但在这里,我每次都得到相同的结果.当我们调用clear或opeartor []时,有人可以解释它在内存级别的工作原理.
我想知道是否有golang方式删除或删除go软件包。为了简单起见,与go get命令相反。
e.g.
$ go get <PACKAGE_NAME>
$ go delete <PACKAGE_NAME> (Looking for similar functionality)
Run Code Online (Sandbox Code Playgroud)
请注意,我知道我们可以使用rm命令从src和pkg目录中手动删除下载的文件。但是问题是系统命令rm无法识别您要执行的特定操作(例如,在$ GOPATH / pkg ..内部查看),这对于使用rm的用户来说是一个额外的步骤。我正在寻找所有软件包管理器都提供的..如一条评论中所述..(npm卸载,pip卸载等)。
我遇到了一段代码,typeid用来获取unique_ptr指向多态对象的类型。
class B{virtual void foo()= 0;};
class D:public B{void foo() override{}};
int main()
{
unique_ptr<B> bd = make_unique<D>();
if (typeid(*bd) != typeid(bd.get()))
{
cout<<"Object types are not same"<<endl;
}
cout<<"Type name of *bd.name(): "<<typeid(*bd).name()<<endl;
cout<<"Type name of bd.get().name(): "<<typeid(bd.get()).name()<<endl;
}
Run Code Online (Sandbox Code Playgroud)
输出为:
Object types are not of same
Type name of *bd.name(): 1D
Type name of bd.get().name(): P1B
Run Code Online (Sandbox Code Playgroud)
get()的输出与使用*取消引用的输出name()不同。另一个观察结果是,当类中没有定义虚函数时(上述示例中没有),get()和*都打印相同的输出。void foo()
问题:
当类中没有虚函数时,为什么get()和*给出不同的输出?
实时示例:https : //gcc.godbolt.org/z/Tiy-Cn
EDIT-1根据unique_ptr上的*,它说“返回* this拥有的对象,等效于* get()。”
对于std :: tr1 :: unordered_map,有没有类似于std :: map :: lower_bound的等效std :: algorithm?
以下代码示例行为未定义..
char * getName()
{
std::string name("ABCXYZ");
return name.c_str();
}
Run Code Online (Sandbox Code Playgroud)
这是因为名称超出了范围.但是我想了解当我们返回一个std :: string并且它不会产生未定义的行为时它是如何不同的?