草庐IT

nothrow_move_constructible

全部标签

c++ - 当基类不是时,为什么派生类可以 move 构造?

考虑以下示例:#include#include#includetemplatestructFoo:publicBase{usingBase::Base;};structBar{Bar(constBar&){}Bar(Bar&&)=delete;};intmain(){std::cout::value>::value为什么编译器生成一个move构造函数,尽管基类是不可move构造的?这是标准还是编译器错误?是否可以“完美地传播”将构造从基类move到派生类? 最佳答案 因为:Adefaultedmoveconstructorthati

c++ - 为什么 C++17 中没有 std::construct_at ?

C++17添加了std::destroy_at,但没有任何std::construct_at对应项。这是为什么?就不能这么简单的实现吗?templateT*construct_at(void*addr,Args&&...args){returnnew(addr)T(std::forward(args)...);}这可以避免那种不完全自然的放置新语法:autoptr=construct_at(buf,1);//insteadof'autoptr=new(buf)int(1);'std::cout 最佳答案 std::destroy_a

c++ - 了解 std::hardware_破坏性_interference_size 和 std::hardware_constructive_interference_size

添加了C++17std::hardware_destructive_interference_sizeandstd::hardware_constructive_interference_size.首先,我认为这只是获取L1缓存行大小的一种可移植方式,但这是过于简单化了。问题:这些常量与L1缓存行大小有何关系?是否有一个很好的例子来展示他们的用例?两者都定义为staticconstexpr。如果您构建二进制文件并在具有不同缓存行大小的其他机器上执行它,这不是问题吗?当您不确定您的代码将在哪台机器上运行时,它如何防止错误共享? 最佳答案

c++ - pass-by-value-and-then-move 结构是一个坏习惯吗?

由于我们在C++中有move语义,现在通常这样做voidset_a(Aa){_a=std::move(a);}原因是,如果a是一个右值,则拷贝将被省略,并且只有一步。但是如果a是左值会发生什么?似乎会有一个复制构造,然后是一个move赋值(假设A有一个正确的move赋值运算符)。如果对象具有太多成员变量,则move分配的成本可能会很高。另一方面,如果我们这样做了voidset_a(constA&a){_a=a;}只有一份拷贝分配。如果我们要传递左值,我们可以说这种方式优于按值传递的习惯用法吗? 最佳答案 昂贵的move类型在现代C+

c++ - 为什么在 C++11 中有 && 时使用 std::move?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Whatismovesemantics?我最近参加了一个C++11研讨会,并给出了以下建议。whenyouhave&&andyouareunsure,youwillalmostalwaysusestd::move谁能向我解释为什么您应该使用std::move而不是某些替代方案以及某些不应该使用std::move的情况? 最佳答案 首先,我要解决的问题可能存在误解:每当你看到T&&t在代码中(并且T是实际类型,不是模板类型),请记住t的值类别是左值(引用),不

c++ - 我可以通常/总是使用 std::forward 而不是 std::move 吗?

我一直在看ScottMeyers的talkonUniversalReferences来自C++andBeyond2012session,到目前为止一切都说得通。然而,一位观众在大约50分钟时提出了一个我也想知道的问题。Meyers说他不关心答案,因为它不习惯用语并且会让他觉得很傻,但我仍然感兴趣。呈现的代码如下://Typicalfunctionbodieswithoverloading:voiddoWork(constWidget¶m)//copy{//opsandexprsusingparam}voiddoWork(Widget&¶m)//move{//opsand

templates - Golang 模板 : for construction

Golanghttp/template有替换功能,if构造,但是我没有找到for构造。如何遍历slice?像这样:{{forxinxs}}Hello,{{x.Name}}!{{end}} 最佳答案 使用范围{{rangexs}}Hello,{{.Name}}!{{end}} 关于templates-Golang模板:forconstruction,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/que

compiler-construction - 使用 Go 反编译已编译的程序

我用Go构建了一个简单的可执行程序。我已将代码编译成静态二进制程序。我想反编译输出的二进制文件,得到Go源码。这可能吗? 最佳答案 没有工具可以做到这一点,并且由于Go程序被编译成机器代码,它们不包含足够的信息来将它们转换回Go代码。不过,标准的拆卸技术仍然可行。 关于compiler-construction-使用Go反编译已编译的程序,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

c++ - move 构造函数和 `std::array`

根据N3485§23.3.2.2:(...)theimplicitmoveconstructorandmoveassignmentoperatorforarrayrequirethatTbeMoveConstructibleorMoveAssignable,respectively.所以,std::array支持move语义,如果它的元素类型支持的话。太好了!但是,这究竟意味着什么?我倾向于将这种类型描绘为提供符合STL接口(interface)的数组的更安全版本,但如果这是真的,那么std::array如何move构造其元素?我可以对普通数组做同样的事情吗?

c++ - move 构造函数和 `std::array`

根据N3485§23.3.2.2:(...)theimplicitmoveconstructorandmoveassignmentoperatorforarrayrequirethatTbeMoveConstructibleorMoveAssignable,respectively.所以,std::array支持move语义,如果它的元素类型支持的话。太好了!但是,这究竟意味着什么?我倾向于将这种类型描绘为提供符合STL接口(interface)的数组的更安全版本,但如果这是真的,那么std::array如何move构造其元素?我可以对普通数组做同样的事情吗?