草庐IT

c++ - std::pow 在 32 位和 64 位应用程序中产生不同的结果

我发现一些复杂计算的结果不匹配。当我彻底观察中间结果时,是std::pow函数造成了不匹配。以下是输入/输出。longdoubledvalue=2.7182818284589998;longdoubledexp=-0.21074699576017999;longdoubleresult=std::powl(dvalue,dexp);64bit->result=0.80997896907296496and32bit->result=0.80997896907296507我正在使用VS2008。我已经尝试使用pow函数的其他变体,它接受longdouble并返回longdouble,但仍然

c++ - std::weak_ptr:锁或 shared_ptr 构造函数?

似乎有两种方法可以暂时获取weak_ptr指向的资源的所有权:使用lock()将weak_ptr传递给shared_ptr构造函数这两者都会产生一个shared_ptr,如果weak_ptr为空并且锁返回一个nullptrshared_ptr构造函数抛出异常。所以问题是:什么时候应该使用一个或另一个?是否有与此相关的一般准则或最佳做法? 最佳答案 复制自http://en.cppreference.com/w/cpp/memory/weak_ptr/lockBoththisfunctionandtheconstructorofstd

c++ - 在编译时填充 std::array 和 const_cast 可能的未定义行为

已知std::array::operator[]由于C++14是constexpr,请参见下面的声明:constexprconst_referenceoperator[](size_typepos)const;但是,它也是const限定的。如果您想使用std::array的下标运算符以便在编译时为数组赋值,这会产生影响。例如考虑以下用户文字:templatestructFooLiteral{std::arrayarr;constexprFooLiteral():arr{}{for(inti(0);i如果您尝试声明类型为FooLiteral的constexpr变量,上述代码将无法编译。这

c++ - 理解 std::future::then 的延续

谁能用C++中的示例解释async([](){x();y();})和async([]()之间的区别{x();}).then([](){y();})?我的理解是,在后一种情况下,x、y中的每一个都可能会立即在不同的线程中启动,并且只会在get时阻塞(在它们各自的线程中)()在未来作为输入传递时被调用。 最佳答案 ...whatisthedifferencebetweenasync([](){x();y();})andasync([](){x();}).then([](){y();})?真的不多-那么为什么要有呢?一言以蔽之可组合性。它

c++ - 具有与 std::function 不同签名的 Lambda 函数

我不明白为什么第三种情况没问题(即使lambda的参数类型不同于std::function类型)而编译器却提示第四种情况:functionidInt=[](inti){returni;};//OKfunctionidInt=[](int&i){returni;};//OKfunctionidInt=[](inti){returni;};//OKfunctionidInt=[](int&i){returni;};//ERROR! 最佳答案 当你写的时候:functionidInt=[](int&i){returni;};//ERROR

c++ - 如何避免 Helgrind 的误报?

我的线程同步“风格”似乎正在摆脱helgrind。这是一个重现问题的简单程序:#include#include#includeintmain(){std::atomicisReady(false);inti=1;std::threadt([&isReady,&i](){i=2;isReady=true;});while(!isReady)std::this_thread::yield();i=3;t.join();std::cout据我所知,上面的程序是一个格式良好的程序。但是,当我使用以下命令运行helgrind时出现错误:valgrind--tool=helgrind./a.out

c++ - 结构化绑定(bind)宽度

是否可以使用结构化绑定(bind)语法来确定我应该在方括号中指定多少个变量名,以匹配普通右侧struct的数据成员数量?我想制作通用库的一部分,它使用结构化绑定(bind)将任意类分解为其组成部分。目前还没有结构化绑定(bind)的可变版本(而且,我认为,不能用于当前提议的语法),但我的第一个想法是对某些函数decompose()进行一组重载,它将struct参数分解为其组成部分。decompose()应该由参数(即struct)数据成员的数量重载。目前constexprif语法也可用于分派(dispatch)它。但是,为了上述目的,我如何模拟类似于sizeof...运算符的东西呢?我

c++ - 为什么 C++ STL 函数调用需要如此冗长?

为什么不能更简短地调用STL函数?我在cppreference.com上查看以下代码片段:#include#include#include#includeintmain(){std::strings("hello");std::transform(s.begin(),s.end(),s.begin(),[](unsignedcharc){returnstd::toupper(c);});std::cout在我看来,应该可以让这次通话更简短。第一件显而易见的事情是取消lambda:std::strings("hello");std::transform(s.begin(),s.end()

c++ - std::exception_ptr 线程安全吗?

我有一个工作线程,它通过std::thread持续运行、创建和管理。在我的工作线程的顶层,我有一个try/catchblock,里面有一个while循环。如果异常泄漏到线程的顶层,我会捕获它并将其存储在std::exception_ptr中,它是还拥有非静态线程函数的类的成员://Inclassheader(insideclassdeclaration)std::exception_ptrm_threadException;//InclassCPPfilevoidMyClass::MyThreadFunction(){try{while(true){//Dothreadstuff}}c

c++ - 如何在新元组中提取元组的子集?

我有一个包含变量类型元组的类,如下所示:templatestructTester{std::tuplet;templatestd::tupleGet(){???}};一个例子是Tester我希望我的Get函数只返回内部元组的一个子集。例如,tester.Get将返回std::tuple其值是从内部元组的适当成员中复制的。您可以假设每种类型在一个元组中最多出现一次,并且Get只会使用元组中合理的模板参数调用。 最佳答案 实际上,这比您想象的要容易。std::get采用类型作为元组成员索引的替代(C++14起),并返回元组中的第一个匹配