我想移动std::packaged_task到std::vector的std::function<void()>,因为std::packaged_task已经void operator()( ArgTypes... args )过载,它应该是可转换到std::function<void()>,是吗?
这不能在MSVC和Clang上编译,MSVC抱怨无法将void转换为int,clang抱怨删除了复制构造函数std::packaged_task,不应该移动版本在std::vector::push_back这里调用?发生了什么,这是一个错误吗?
int main ()
{
std::vector<std::function<void()>> vec;
std::packaged_task<int()> task( [] { return 100; } );
vec.push_back( std::move(task) );
}
Run Code Online (Sandbox Code Playgroud)
这是clang的神秘模板错误消息
In file included from main.cpp:1:
In file included from /usr/bin/../lib/c++/v1/iostream:38:
In file included from /usr/bin/../lib/c++/v1/ios:216:
In file included from /usr/bin/../lib/c++/v1/__locale:15:
In file included from /usr/bin/../lib/c++/v1/string:434:
In file included from /usr/bin/../lib/c++/v1/algorithm:594:
/usr/bin/../lib/c++/v1/memory:2236:15: error: call to deleted constructor of
'std::__1::packaged_task<int ()>' …Run Code Online (Sandbox Code Playgroud) struct Point {
int x = 0;
int y = 10;
};
Point p = {1,};
p.x == 1; // true
p.y == 10; // is this true?
Run Code Online (Sandbox Code Playgroud)
根据初始化列表中的标准缺失元素是值初始化,所以y应该是int()或者0,但它似乎并没有说明在非静态数据成员初始化器的情况下发生了什么.
编辑:根据答案,显然这是无效的c ++ 11,我想知道c ++ 1y中的情况.
我正在尝试将我的项目目录添加到GOPATH,在linux中我能做到
export GOPATH=$HOME/mygo 在〜/ .bashrc中
powershell中的等价物是什么
我有一个功能
struct foo {
std::vector<int> v;
};
foo func();
Run Code Online (Sandbox Code Playgroud)
从函数返回时,foo中的向量是否会被移动或复制?
我有一个简单的程序.
int main()
{
std::atomic<bool> b = true;
ConcurrentQueue<std::string> queue;
std::thread thread( [&]{
while ( b ) {
auto str = queue.wait_and_pop();
std::cout << *str;
}
});
b = false;
queue.push( "end" );
thread.join();
}
Run Code Online (Sandbox Code Playgroud)
ConcurrentQueue<T>是我自己的线程安全队列的实现,wait_and_pop是一个使用的阻塞操作std::condition_variable.
这个程序成功打印"结束"并退出,这里没问题.(有一个错误b的时候是假的thread开始,其原因就立即退出,但这里不相关)
但是,如果我将所有这些包装在一个类中
class object {
public:
object() {
b = true;
thread = std::thread( [this]{
while ( b ) {
auto str = queue.wait_and_pop();
std::cout << *str;
}
});
}
~object() {
b = false; …Run Code Online (Sandbox Code Playgroud) 参加以下计划:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[8] = "Hello, ";
char b[7] = "world!";
strcat(a, b);
cout << a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,a并且b其大小与指定的字符串相同.
该文件规定,对于strcat(a, b)工作,a需要足够大,以包含串联的结果字符串.
不过,cout << a显示"Hello, world!".我进入未定义的行为吗?
我有一个程序,编译和运行另一个程序并将stdout传递给自己进行打印,因为该程序没有终止所以我需要流式传输它的stdout
// boilerplate ommited
func stream(stdoutPipe io.ReadCloser) {
buffer := make([]byte, 100, 1000)
for ;; {
n, err := stdoutPipe.Read(buffer)
if err == io.EOF {
stdoutPipe.Close()
break
}
buffer = buffer[0:n]
os.Stdout.Write(buffer)
}
}
func main() {
command := exec.Command("go", "run", "my-program.go")
stdoutPipe, _ := command.StdoutPipe()
_ = command.Start()
go stream(stdoutPipe)
do_my_own_thing()
command.Wait()
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是如果不用for循环重复检查我该怎么做呢,是否有一个库函数做同样的事情?