我需要std::vector<Blah> v通过Blah的整数id 对自定义类型的向量进行排序.我这样做是因为std::sort(v.begin(), v.end())操作员<在内部过载Blah
bool operator< (const Blah& b) const { return (id < b.id); }
Run Code Online (Sandbox Code Playgroud)
我注意到Blah的私有id不能被声明为const int id,否则该类型Blah不符合要求std::sort(我认为它与不是ValueSwappable冲突?)
如果id不是const一切都很好.但是,我不喜欢对象没有常数id的想法只是为了在向量中重新排列它们的顺序.
有办法还是这样?
我最近遇到了类似以下的课程
class Foo {
public:
Foo(std::string msg) {}
private:
Foo(bool b) {}
};
Run Code Online (Sandbox Code Playgroud)
我注意到试图通过创建这个类的对象
Foo foo("blah");
Run Code Online (Sandbox Code Playgroud)
导致编译错误,告知它Foo::Foo(bool)是私有的.显然,如果参数不是实际的std :: string,编译器更喜欢将构造函数与bool参数一起使用.另一方面,如果没有给出私有构造函数,上面的代码编译就好了.
为什么"-constructor bool"优先于string"-constructor"althogh传递的参数的类型不适合它们中的任何一个?这只是一个定义的问题,还是有更深层次的意义和一些好理由?
在以下代码中,该getObj()函数返回对本地对象的引用.这显然是非常糟糕的,因为当函数返回时对象被破坏(ctor和dtor输出强调对象的生命周期).正如所料,编译器(gcc44)给出了相应的警告.
#include <iostream>
class Blah {
private:
int a_;
public:
Blah(int a) : a_(a) { std::cout << "Constructing...\n"; }
~Blah() { std::cout << "...Destructing\n"; }
void print() { std::cout << a_ << "\n"; }
};
Blah& getObj()
{
Blah blah(3);
return blah; // returning reference to local object
}
int main()
{
Blah& b = getObj();
b.print(); // why does this still output the correct value???
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,调用print()明显被破坏的对象仍然会打印私有变量的正确值a_.这是输出:
构建......
...破坏
3
怎么会这样?我本来希望所有的对象数据都被销毁.