c++11 相关问题

将此标记用于必须编译为C ++ 11的代码(不使用C ++ 14或更高版本中引入的任何功能)。

带有 std::defer_lock 参数的 std::lock_guard 构造函数

我很好奇要传递给lock_guard构造函数的第二个参数,特别是如果它等于std::defer_lock。 由于lock_guard对象没有提供锁定的方法

回答 1 投票 0

C++标准核心语言规范中的注释和示例是否不规范?

我经常在 SO(和其他地方)上看到这样的说法:C++ 标准中的注释和示例不规范 - 我自己可能已经多次提出过这样的说法。 然而我找不到证据...

回答 3 投票 0

std::thread::id 跨进程是否唯一?

根据我的经验,结果似乎是 std::this_thread::get_id() 在整个进程中是唯一的:一个进程的 id 与另一个进程不同。 这是标准保证的吗?

回答 3 投票 0

std::move(*this) 是一个好的模式吗?

为了使带有 C++11 引用限定符的这段代码按预期工作,我必须引入一个听起来不对的 std::move(*this) 。 #包括 结构体A{ void Gun() const&...

回答 2 投票 0

我什么时候应该按值返回,而不是返回唯一的指针

我想知道的是,在传递它们、内存管理和在实践中使用它们方面,按值返回 Cat 实际上与返回 std::unique_ptr 有什么不同。

回答 3 投票 0

为什么这个获取和释放内存栅栏没有给出一致的值?

我只是在探索获取和释放内存栅栏的使用,不明白为什么我有时会将值输出为零而不是始终为 2 我运行了该程序多次...

回答 4 投票 0

为什么 stoi 比没有 -O3 的 stringstream 慢很多?

今天我谈论的是 C++11 中的新闻特性,例如线程、to_string 和 stoi。 但事实上,这一切在 C++98 中已经成为可能。 然后我决定将旧库与新闻库进行比较...

回答 2 投票 0

后续用C++11定义相关数据时如何使用decltype?

如何让下面的代码片段在不先写成员变量的情况下用C++11编译?在成员函数之前写成员变量看起来很难看。 #包括 民主党班级...

回答 1 投票 0

具有相同底层实现的不同类型

我想创建不同的类型A、B和C。所有这三种类型共享相同的功能(它们的公共功能具有相同的实现),但这三种类型需要不同...

回答 1 投票 0

C++ 在没有活动异常的情况下终止调用

我在线程方面遇到了 C++ 错误: 在没有活动异常的情况下终止调用 中止 这是代码: #包括 #包括 #包括 #包括<

回答 6 投票 0

如何知道`std::vector::begin()`变得无效?

下面的代码片段可以在 cppreference 中看到。 为什么第三次插入vecotr时std::vector::begin()无效。我认为当向量有

回答 2 投票 0

在c++中,内存将分配给全局函数,并且全局函数的地址会在运行时改变还是不会改变?

//绑定示例 #include // std::cout #include // std::bind // 一个函数: (也适用于函数对象: std::divides my_divide;) 双

回答 1 投票 0

在带有模板基的派生类中使用类型别名模板的声明

如果基类依赖于模板参数,则在非限定名称查找中不会检查其范围。我可以使用 using 声明来引入基类中的名称。假设现在我...

回答 3 投票 0

C++11 std::thread 与 Posix 线程

为什么我在实践中应该选择其中一种? 除了 std::thread 是一个类之外,还有哪些技术差异?

回答 5 投票 0

C++11 及以上版本中 std::thread 相对于 pthread 的优势[重复]

我见过在C++11(或更高版本)中使用pthread编写多线程程序的代码以及其他使用std::thread库的代码。使用std::thread库安装有什么好处...

回答 1 投票 0

mersennetwister 线程对 cpp 安全吗

#包括 int f() { std::random_device 播种器; std::mt19937 引擎(播种机()); std::uniform_int_distribution dist(1, 6); 返回距离(引擎); } 可以多...

回答 2 投票 0

如何使用 lambda 将字符串中的字符累加为数字?

如何使用 lambda 将字符串 num 中的所有数字求和为整数和? std::string num = "1234567891011"; int sum = 累积(num.begin(), num.end(), 0, [](auto & a, auto &...

回答 1 投票 0

std::forward 的第二次重载(cppreference.com 上的示例)

我知道 std::forward 的第二次重载: 模板< class T > constexpr T&& 向前( std::remove_reference_t&& t ) noexcept; 用于右值(如

回答 1 投票 0

是否存在 std::atomic<T> 应该标记为 volatile 的情况?

在什么情况下您希望将 std::atomic 或 std::atomic_flag 标记为易失性(如果有的话)? 中断处理程序中使用的 std::atomic_flag 怎么样?是否...

回答 1 投票 0

如何:捕获输入函数异常的可变参数包装函数

我正在尝试创建一个可以传递其他函数的函数,这将捕获任何错误,但否则只是返回函数的返回值。这是我尝试过的: #包括 我正在尝试创建一个可以传递其他函数的函数,它将捕获任何错误,但否则只是返回函数的返回值。这是我尝试过的: #include <iostream> using namespace std; int fun(int input) { return input; } template <typename F, typename...Args> static auto HandledCall(const F& function, Args...args) -> decltype(function(...args)) { try { return function(...args); } catch(...) { return NULL; } } int main() { std::cout << HandledCall(fun,1) << std::endl; // this should return 1 std::cout << HandledCall(fun,-1) << std::endl; // this should return 0 return 0; } 希望意图比较明确;我希望 HandledCall 能够接收任何类型的函数,并返回其返回值(只要 NULL 在发生错误时可以隐式转换为该值)。然而,当我尝试编译上面的代码时,我收到了这些类型的错误; prog.cpp:10:78: 错误:“...”标记之前需要主表达式 静态自动 HandledCall(const F& 函数, Args...args) -> decltype(函数(...args)) 显然我没有正确地执行这个可变参数模板...有什么建议吗? 函数调用的返回类型可以使用 std::result_of 确定。 template<typename F, typename... Args> typename std::result_of<F(Args...)>::type HandledCall(F&& func, Args&&... args) { using result_type = typename std::result_of<F(Args...)>::type; try { return std::forward<F>(func)(std::forward<Args>(args)...); } catch(...) { return result_type(); } } 现场演示 有这样的事吗? #include <iostream> using namespace std; int fun(int input) { return input; } template <typename T> struct ReturnType; template<class Ret, class... Args> struct ReturnType<Ret(Args...)> { typedef Ret type; }; template <typename F, typename...Args> static auto HandledCall(const F& function, Args...args) -> typename ReturnType<F>::type { try { return function(args...); } catch(...) { return typename ReturnType<F>::type{0}; } } int main() { std::cout << HandledCall(fun,1) << std::endl; // this should return 1 std::cout << HandledCall(fun,-1) << std::endl; // this should return 0 return 0; } 更新 HandledCall的改进版本(感谢Mankarse): template <typename F, typename...Args> static auto HandledCall(const F& function, Args&&...args) -> typename ReturnType<F>::type { try { return function(std::forward<Args>(args)...); } catch(...) { return typename ReturnType<F>::type{0}; } } 这是一个基于 @Praetorian 提出的解决方案的版本,但它也适用于具有 void 返回类型的函数。其他答案无法处理这种情况的原因是 void 类型的对象的显式实例化。 template<typename T> T default_value(){return {};} template<> void default_value<void>(){} template<typename F, typename... Args> typename std::result_of<F(Args...)>::type HandledCall(F&& func, Args&&... args) { try { return std::forward<F>(func)(std::forward<Args>(args)...); } catch(...) { return default_value<typename std::result_of<F(Args...)>::type>(); } } 这样做的原因是因为标准允许在具有 void 返回类型的函数中显式返回 void 值。 包装的函数通常在编译时就已知,因此我建议通过如下所示的方式来利用它(> = c ++ 17): #include <cstdlib> #include <stdexcept> #include <type_traits> #include <utility> template <auto F, typename... Args> auto nonThrowingFunWrapper(Args... args) { using result_type = std::invoke_result_t<decltype(F), Args...>; constexpr std::integral_constant<decltype(F), F> fun_object; try { return fun_object(std::forward<Args>(args)...); } catch (...) { std::abort(); return result_type(); } } int foo(int bar) { throw std::runtime_error("foo failed"); return bar; } int main() { return nonThrowingFunWrapper<foo>(43); }

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.