小编Sit*_*esh的帖子

声明为consts的函数args在定义时变为非常量

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)和定义(非常量)放在一起,但编译器仍然接受它.如果可以犯错误,最终会犯错误.当存在这样的差异时,为什么编译器不能抱怨.

c++ constants c++11 c++14

5
推荐指数
2
解决办法
240
查看次数

为什么没有类似于std :: string_view的视图<T>

据我所知,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也很有用,如分配,复制等.

c++ stdstring c++17

4
推荐指数
1
解决办法
347
查看次数

在std :: map中找到最接近输入数范围的最有效的std算法是什么?

我的数据将存储在整数和整数的映射中.键是任何数字的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.

c++ algorithm stdmap

3
推荐指数
1
解决办法
164
查看次数

std :: string assign,clear和operator []的奇怪行为

我正在观察字符串操作的一些奇怪行为.

例如:

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 []时,有人可以解释它在内存级别的工作原理.

c++ string clear

2
推荐指数
1
解决办法
183
查看次数

如何删除使用“ go get”命令下载的Go软件包?

我想知道是否有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卸载等)。

go

2
推荐指数
2
解决办法
2510
查看次数

c ++ typeid使用get()和*为同一unique_ptr返回不同的值

我遇到了一段代码,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()。”

c++ inheritance rtti typeid unique-ptr

2
推荐指数
1
解决办法
59
查看次数

对于std :: tr1 :: unordered_map,有没有类似于std :: map :: lower_bound的等效std :: algorithm?

对于std :: tr1 :: unordered_map,有没有类似于std :: map :: lower_bound的等效std :: algorithm?

c++ algorithm unordered-map

0
推荐指数
1
解决办法
303
查看次数

使用c_str()时std :: string的未定义行为

以下代码示例行为未定义..

char * getName()
{
   std::string name("ABCXYZ");
   return name.c_str();
}
Run Code Online (Sandbox Code Playgroud)

这是因为名称超出了范围.但是我想了解当我们返回一个std :: string并且它不会产生未定义的行为时它是如何不同的?

c++ string copy char

0
推荐指数
1
解决办法
156
查看次数