小编Stu*_*t4K的帖子

具有左值表达式的std :: vector :: emplace_back

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,并且未明确禁止使用它吗?

c++ variadic-templates emplace

7
推荐指数
1
解决办法
199
查看次数

这里不允许使用cdef语句来表示结构

我有一个带结构定义的简单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循环有什么特别之处.

cython

6
推荐指数
1
解决办法
6195
查看次数

奇怪的运算符?:使用decltype

我正在读一本解释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头文件相比,它以略微简化的形式给出.

c++ decltype

5
推荐指数
1
解决办法
514
查看次数

Git hooks 文件命名

我想安装一些自定义挂钩来禁止在本地提交/推送到 master 分支,但对有关自定义挂钩用法和文件命名的 Git 文档感到困惑。\n这里摘录自https://git-scm.com/book/ gr/v2/定制-Git-Git-Hooks

\n
\n

所有示例都是以 shell 脚本形式编写的,其中包含一些 Perl 脚本,但任何正确命名的可执行脚本都可以正常工作 \xe2\x80\x93 您可以\n用 Ruby 或 Python 或您拥有的其他语言编写它们。如果您想使用\n捆绑的挂钩脚本,则\xe2\x80\x99必须重命名它们;它们的文件名都以 .sample 结尾。

\n

要启用挂钩脚本,请将文件放入\nGit 目录的 hooks 子目录中,该文件具有适当的名称且可执行。从那时起,应该调用它。我们\xe2\x80\x99 将在这里涵盖大部分主要的钩子\n文件名。

\n
\n

所以我有两个问题:

\n
    \n
  1. 文档中提到的“适当”命名到底是什么?AFAICS 未在该页面上定义。
  2. \n
  3. 例如,如果使用自定义预提交脚本(不是捆绑的 pre-commit.sample),假设捆绑的脚本在 hooks 目录中也保持完整,那么它是否会覆盖捆绑的脚本,或者两者会相继运行并且如果是,按什么顺序?
  4. \n
\n

git

5
推荐指数
1
解决办法
3059
查看次数

字符串流和二进制数据

为了从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构建)。

c++ binary stringstream

4
推荐指数
1
解决办法
3790
查看次数

相互交织的范围如何造成“数据竞争”?

锈书大约有多个读者和多个可变对象引用的数据竞争情况,可能会导致问题进行会谈。

例如,这段代码:

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 编译器拒绝,因为r1r2作用域交织在一起。

但是这里有什么问题呢?我的意思是,这只是一个线程,没有“同时读取和写入”,因此所有这些语句都应严格按顺序执行并给出确定性的可重现结果。

reference mutability rust borrow-checker borrowing

1
推荐指数
1
解决办法
124
查看次数

使用reference_wrappers初始化向量

我正在尝试使用引用包装器向量运行一个示例,但在向量变量声明处遇到编译错误。这是代码:

\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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

向量构造函数std::initializer_list存在。传递值的类型必须是const T,它std::cref会返回,那么为什么它会抱怨:

\n\n
/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                                                         ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

?\n(如果重要的话,使用 gcc -std=c++17 构建)

\n

c++ vector initializer-list reference-wrapper

0
推荐指数
1
解决办法
893
查看次数