琐碎c++1

继上一篇琐碎c++足部整理在c++中遇到有意思的应用(自己感觉c++的程序原脑子都态他妈好了,这样的应用都能想出来)

关于c++11中的线程

void fun(string const& t1);
void oops(int some_param)
{
    std::thread t(fun, "hello");
    t.detach();
}
  • 在std::thread(fun,string)中由于fun(string const t1)中参数是string类型的,但是你想直接像std::thread(fun,”hello”),这样的方式调用的话,可能会发生意想不到问题(原因:“hello”其实是const char *类型的,当本地const char *传递到新的线程中,函数有可能在转化为string对象完成之前奔溃,这样就会导致一些未定义的行为),这时候就需要显示的转化,如下
void fun(string const& t1);
void oops(int some_param)
{
    std::thread t(fun, std::string("hello"));
    t.detach();
}
  • 如上的转化在需要传引用的时候也是有必要的(即使你的回调函数的参数是应用类型)!引用的显示转化代码如下:
std::ref(data);

关于Rcalue和Lvalue Reference的重载规则

  • 如果你只实现void foo(X&);而没有实现void foo(X&&);
    行为如同c++98;foo()可因lvalue但不可因rvalue被调用。
  • 实现:void foo(const X&);
    未实现:void foo(X&&);
    行为:如同c++98,foo()可因lvalue也可因rvalue被调用。
  • 实现:void foo(X&); void foo(X&&); 或者
    void foo(const X&); void foo(X&&);
    行为:你可以区分“为rvalue服务”和“为lvalue服务”的版本被允许且应该提供move语义。也就是说,它可以“偷取”实参的内部状态和资源。
  • 实现:void foo(X&&);
    未实现:void foo(X&&); void foo(const X&);
    行为:foo()可因rvalue被调用,但是当你尝试以lvalue调用它,会触发编译错误。因此,这里只提供move()语义。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章