给出以下代码:
struct Window{
void show();
//stuff
}w1, w2, w3;
struct Widget{
void show();
//stuff
}w4, w5, w6;
struct Toolbar{
void show();
//stuff
}t1, t2, t3;
Run Code Online (Sandbox Code Playgroud)
我想要show一堆物品:
for (auto &obj : {w3, w4, w5, t1})
obj.show();
Run Code Online (Sandbox Code Playgroud)
然而,这不会编译,因为std::initializer_list<T>在for-loop中无法推断T,事实上并没有真正T适合的.我不想创建类型擦除类型,因为需要大量的代码和不必要的运行时开销.如何正确编写循环以便obj分别为概念列表中的每个项推导出类型?
我有以下代码:
#include <iostream>
#include <random>
int main() {
std::mt19937_64 rng(std::random_device{}());
std::cout << std::uniform_int_distribution<>(0, 100)(rng) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用valgrind它来描述它,但它说:
vex amd64->IR: unhandled instruction bytes: 0xF 0xC7 0xF0 0x89 0x6 0xF 0x42 0xC1
vex amd64->IR: REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR: VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=0F
vex amd64->IR: PFX.66=0 PFX.F2=0 PFX.F3=0
==2092== valgrind: Unrecognised instruction at address 0x4cdc1b5.
==2092== at 0x4CDC1B5:std::(anonymous namespace)::__x86_rdrand() (random.cc:69)
==2092== by 0x4CDC321: std::random_device::_M_getval() (random.cc:130)
==2092== by 0x4009D4: main (random.h:1619)
Run Code Online (Sandbox Code Playgroud)
在多个实例之前:
--2092-- WARNING: Serious error when reading …Run Code Online (Sandbox Code Playgroud) 给出以下示例代码:
int var;
int mvar;
std::mutex mvar_mutex;
void f(){
mvar_mutex.lock();
mvar = var * var;
mvar_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)
我想表达它mvar_mutex绑定到变量mvar并仅保护该变量.mvar_mutex不应该保护,var因为它不受约束.因此,允许编译器将上面的代码转换为以下代码:
int var;
int mvar;
std::mutex mvar_mutex;
void f(){
int r = var * var; //possible data race created if binding is not known
mvar_mutex.lock();
mvar = r;
mvar_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)
这可能会减少锁定上的争用,因为在保持锁定时工作量较少.
为此int可以使用std::atomic<int> mvar;和删除mvar_mutex,但对于其他类型,std::vector<int>这是不可能的.
如何以C++编译器理解并进行优化的方式表达互斥变量绑定?对于未绑定到该互斥锁的任何变量,应该允许在互斥锁边界上向上或向下重新排序任何变量
由于代码是使用生成的,clang::ASTConsumer并且clang::RecursiveASTVisitor我愿意使用非标准扩展和AST操作,只要clang(理想情况下是clang 4.0)支持它们并且生成的代码不需要优雅或人类可读.
编辑,因为这似乎导致混淆:上述转换在C++中是不合法的.所描述的互斥锁与变量的绑定不存在.问题是如何实现或实现相同的效果.
T *t; //T is an implementation detail
t = new T; //want to avoid naming T to allow for flexibility
t = new decltype(*t); //error: cannot use 'new' to allocate a reference
t = new std::remove_reference<decltype(*t)>::type(); //clunky
Run Code Online (Sandbox Code Playgroud)
这回答了为什么decltype(*t)返回T &而不是T.
我可以把我的最后一行放到一个宏中,但这似乎不是最理想的.有没有比我到目前为止更好的解决方案?这是否属于Code Review?
许多用于std::unique_ptr管理类依赖项所有权的示例如下所示:
class Parent
{
public:
Parent(Child&& child) :
_child(std::make_unique<Child>(std::move(child))){}
private:
std::unique_ptr<Child> _child;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,标记该_child成员是否const有任何意想不到的副作用?(除了是保证reset(),release()等不能被称为_child).
我问,因为我还没有在一个例子中看到它,不知道这是故意还是仅仅是为了简洁/普遍.
我的构建失败,出现以下链接器错误消息:
FAILED :: &&/usr/bin/g ++ -Wall -Wextra -Werror -g -fsanitize = undefined,address -Wno-unused-parameter -fsanitize = undefined,address -dynamic*.o -o SCE -Wl,-rpath,/opt/qt59/lib /opt/qt59/lib/libQt5Widgets.so.5.9.1 /usr/local/lib/libprotobuf.a -lpthread -lutil -lgrpc ++ /opt/qt59/lib/libQt5Gui.so.5.9.1 /opt/qt59/lib/libQt5Core.so.5.9.1&&:/
usr/bin/x86_64-linux-gnu-ld:无法识别的选项'--push-state - no-as-needed'
您可以在此处查看完整的构建日志.错误在第2211行,版本在第2104ff行打印.
哪个工具导致错误?
gcc 7.3.0使用了不正确的链接器标志?的ld文档表示--push-state和--no-as-needed是分开的命令.ld 2.28太老了解链接器标志?在更改日志没有列出任何似乎与.&& /usr/bin/g++看起来很奇怪,应该是/usr/bin/g++.使用make而不是ninja显示相同的链接错误.它正确地建立在其上使用Debian测试gcc 7.3.0以及和ld 2.30,但似乎没有成为一个工作binutils-2.30Ubuntu的忠实的PPA.
如何在Travis上成功构建我的项目?
我有一个具有单元测试的文件TestProtocol.py.我可以运行该脚本并按预期获得我的30个测试的测试结果.现在我想从tester.py位于同一目录中的另一个文件运行这些测试.在里面tester.py我尝试了import TestProtocol,但它运行0测试.
然后我找到了说我应该这样做的文档:
suite = unittest.TestLoader().discover(".", pattern = "*")
unittest.run(suite)
Run Code Online (Sandbox Code Playgroud)
这应该遍历当前目录.中与模式匹配的*所有文件,因此所有文件中的所有测试都是如此.不幸的是,它再次运行0次测试
有一个相关的质量保证建议做
import TestProtocol
suite = unittest.findTestCases(TestProtocol)
unittest.run(suite)
Run Code Online (Sandbox Code Playgroud)
但是也没有找到任何测试.
如何导入和运行我的测试?
我在我创建的命名空间中有一些函数在我的程序中使用.
在头文件中:
namespace NQueens
{
static int heur = 0;
int CalcHeuristic(char** state, int size);
void CalcHorzH(char ** state, int &heuristic, int size);
void CalcColH(char ** state, int &heuristic, int size);
void CalcDiagH(char ** state, int &heuristic, int size);
int calcCollisions(int queensPerRow, int size);
}
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,从我的外部程序代码实际调用的唯一函数是CalcHeuristic(char** state, int size)函数.然后该函数调用其他函数本身.
由于这些不属于某个类,我的编译器不会让我声明其他函数private.有没有办法做到这一点?我应该担心吗?
我有一个关于fstream的构造函数和.open函数的简单问题.以下两个表达式之间是否有任何差异?
fstream("file.txt",ios::app);
Run Code Online (Sandbox Code Playgroud)
fstream fin;
fin.open("file.txt",ios::app);
Run Code Online (Sandbox Code Playgroud)
对于(1),我不需要再次使用.open函数了吗?两个表达式之间的任何功能差异?
我的第二个问题是,如果我将openmode留空,那么默认的开放模式是什么?
这段代码
struct Foo{
void f(){
f(0);
}
private:
void f(int){}
};
struct Bar : private Foo{
using Foo::f;
};
int main() {
Bar b;
b.f();
}
Run Code Online (Sandbox Code Playgroud)
无法编译,因为Foo::f(int)是private. 我不感兴趣Foo::f(int),我只是想要Foo::f()哪个public,所以我觉得应该有办法做到这一点。
我能想到一些解决方法:
Foo::f(int)为Foo::p_f(int),但这是多余的并且不允许重载解析fBar::foo(){Foo::f();}进行大量复制/粘贴public fpublicly 并Foo邀请 UB 因为~Foo()不是virtual(也不应该是)fspublic很容易意外Foo损坏Bar有办法说吗using public Foo::f;?或者使用其中一种没有相关缺点的解决方法?