emplace_back与某些struct的左值一起使用是否有实际意义S:
像这样:
std::vector<S> v;
auto s = S(/*...*/);
v.emplace_back(s);
Run Code Online (Sandbox Code Playgroud)
不仅仅是:
v.emplace_back(/* S constructor arguments */);
Run Code Online (Sandbox Code Playgroud)
还是只是简单地滥用emplace_back,这只是因为const S&(并因此成为复制构造函数)是Args... argsinside的合法实例化而才起作用的emplace_back,并且未明确禁止使用它吗?
我有一个带结构定义的简单Astruct.pyx(Astruct.pxd):
cdef struct A:
int x
int y
int z
Run Code Online (Sandbox Code Playgroud)
还有一个使用它的Cython函数(struct_test.pyx):
from random import randint
from Astruct cimport A
def do():
N = 1000000
M = 65535
As = []
total = 0
for i in xrange(N):
cdef A a
a.x = randint(0, M)
a.y = randint(0, M)
a.z = randint(0, M)
As.append(a)
for i in xrange(N):
total += As[i].x + As[i].y + As[i].z
print total
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试构建struct_test.pyx时,我收到此错误:"此处不允许使用cdef语句",指向"cdef A a".如果它在循环之外,它不会抱怨A变量的另一个定义,但我不明白for循环有什么特别之处.
我正在读一本解释C++特性的书,并且有一个C++ type_traits标题的例子有一个奇怪的?:用法,这里是相应的/ usr/include/c ++/...文件的引用:
template<typename _Tp, typename _Up>
static __success_type<typename decay<decltype
(true ? std::declval<_Tp>()
: std::declval<_Up>())>::type> _S_test(int);
Run Code Online (Sandbox Code Playgroud)
抛开给定声明的目的,?:操作符的使用让我困惑于此代码.如果第一个操作数是true,那么std::declval<_Tp>()将始终选择作为评估的结果.这个declval操作数选择实际上是如何工作的?
编辑:最初阅读Nicolai M. Josuttis的"The C++ Standard Library:A Tutorial and Reference,2nd ed.",第125页.但是与我的GCC头文件相比,它以略微简化的形式给出.
我想安装一些自定义挂钩来禁止在本地提交/推送到 master 分支,但对有关自定义挂钩用法和文件命名的 Git 文档感到困惑。\n这里摘录自https://git-scm.com/book/ gr/v2/定制-Git-Git-Hooks:
\n\n\n所有示例都是以 shell 脚本形式编写的,其中包含一些 Perl 脚本,但任何正确命名的可执行脚本都可以正常工作 \xe2\x80\x93 您可以\n用 Ruby 或 Python 或您拥有的其他语言编写它们。如果您想使用\n捆绑的挂钩脚本,则\xe2\x80\x99必须重命名它们;它们的文件名都以 .sample 结尾。
\n要启用挂钩脚本,请将文件放入\nGit 目录的 hooks 子目录中,该文件具有适当的名称且可执行。从那时起,应该调用它。我们\xe2\x80\x99 将在这里涵盖大部分主要的钩子\n文件名。
\n
所以我有两个问题:
\n为了从std :: basic_stringstream读/写二进制数据需要什么(某些方法重写?)?我正在尝试以下代码,但是它没有按我预期的那样工作:
std::basic_stringstream<uint64_t> s;
uint64_t a = 9;
s << a;
uint64_t b;
s >> b;
std::cout << b << std::endl;
Run Code Online (Sandbox Code Playgroud)
但我得到“ 0”的字样(使用GCC构建)。
该锈书大约有多个读者和多个可变对象引用的数据竞争情况,可能会导致问题进行会谈。
例如,这段代码:
fn main() {
let mut x = 1;
let r1 = &mut x;
*r1 = 2;
let r2 = &mut x;
*r2 = 3;
println!("{}", r1);
println!("{}", r2);
}
Run Code Online (Sandbox Code Playgroud)
将被 Rust 编译器拒绝,因为r1和r2作用域交织在一起。
但是这里有什么问题呢?我的意思是,这只是一个线程,没有“同时读取和写入”,因此所有这些语句都应严格按顺序执行并给出确定性的可重现结果。
我正在尝试使用引用包装器向量运行一个示例,但在向量变量声明处遇到编译错误。这是代码:
\n\n#include <iostream>\n#include <vector>\n#include <functional>\n\nusing namespace std;\n\nstruct Base\n{\n virtual void print() = 0;\n};\n\nstruct X1: public Base\n{\n void print() override\n {\n cout << "X1\\n";\n }\n};\n\nstruct X2: public Base\n{\n void print() override\n {\n cout << "X2\\n";\n }\n};\n\n\nint main()\n{\n X1 x1;\n X2 x2;\n vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};\n}\nRun Code Online (Sandbox Code Playgroud)\n\n向量构造函数std::initializer_list存在。传递值的类型必须是const T,它std::cref会返回,那么为什么它会抱怨:
/home/u1/sandbox/c++/trash/untitled/main.cpp:33: error: no matching function for call to \xe2\x80\x98std::vector<std::reference_wrapper<Base> >::vector(<brace-enclosed initializer list>)\xe2\x80\x99\n vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};\n ^\nRun Code Online (Sandbox Code Playgroud)\n\n?\n(如果重要的话,使用 gcc -std=c++17 构建)
\n