琐碎c++1"/>
琐碎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()语义。
更多推荐
琐碎c++1
发布评论