c++11 相关问题

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

调整大小时 std::vector 会复制/移动元素吗?

我正在与移动c'tors进行学习/刷新练习,我遇到了一些意想不到的事情。下面我有一个包含 std::string m_name; 的类 person。我正在使用这个...

回答 1 投票 0

VS2019 结构定义中的alignas 否决了pragma pack

我正在尝试使用#pragma pack 打包结构“Test”。 在 VS2019 16.7.2 中,以下静态断言失败。 结构alignas(4 * sizeof(float)) Vec4 { 浮动 x、y、z、w; }; #pragm...

回答 2 投票 0

C++11:Linux 上的 std::thread 是否依赖于 pthread 库?

我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。 所以我想知道在linux系统上,gcc/clang如何实现std::thr...

回答 4 投票 0

在类成员函数中使用作用域枚举的最佳实践

我专注于保持良好的代码风格。与在类中使用 this-> 类似,在类内枚举前面添加类名是否更好? 具体来说,这是一个例子: 类车{

回答 1 投票 0

定义类成员函数时应该使用 Color 还是 Car::Color ?

我正在开发一个 C++ 类,并且有一个关于在类中使用枚举类的最佳实践的问题。 考虑以下代码: 类车{ 民众: 枚举类颜色{ 红色的, ...

回答 1 投票 0

模板特化的枚举成员的前向声明 - GCC 失败

我知道,一般来说,我们可以在 C++11 中前向声明枚举。 那么,为什么会这样: 枚举 kind_t { kind1, kind2 }; 模板 结构 foo {}; 模板 <> 结构 foo 我知道,一般来说,我们可以在 C++11 中前向声明枚举。 那么,为什么会这样: enum kind_t { kind1, kind2 }; template <kind_t Kind> struct foo {}; template <> struct foo<kind1> { enum named : int; }; enum foo<kind1>::named : int { named1 = 123, named2 = 456, }; GCC(12.1)编译失败?错误是(Godbolt): <source>:9:6: error: cannot add an enumerator list to a template instantiation 9 | enum foo<kind1>::named : int { | ^~~~~~~~~~ ASM generation compiler returned: 1 <source>:9:6: error: cannot add an enumerator list to a template instantiation 9 | enum foo<kind1>::named : int { | ^~~~~~~~~~ 这似乎可以用 clang++ 14.0 编译良好... 当前代码中的前向声明枚举遇到错误,而 clang 和 msvc 似乎可以很好地处理它。 enum kind_t { kind1, kind2 }; template <kind_t Kind> struct foo {}; template <> struct foo<kind1> { enum named : int; }; enum foo<kind1>::named : int { named1 = 123, named2 = 456, }; 如果您想让代码与 GCC (12.1) 兼容,请尝试直接在类专业化内部定义枚举而不使用前向声明: enum kind_t { kind1, kind2 }; template <kind_t Kind> struct foo {}; template <> struct foo<kind1> { enum named : int { named1 = 123, named2 = 456, }; }; 现场演示

回答 1 投票 0

在创建shared_ptr的副本之前,原始的shared_ptr是否可能超出范围

这可能是一个愚蠢的问题,但我无法回答。 使用下面的代码片段,输出是否有可能打印“Shared Ptr out of range” 我正在尝试的是在共享之前

回答 1 投票 0

共享库中静态库中现有函数的符号查找错误

我有一个静态库“import”,它提供了一个非成员函数 import_init(char*) 以及一个类 ImportObject,其成员函数 Import(char*) 引用了 import_init(...

回答 1 投票 0

设置可打印消息的编译时间前缀

我想创建一个打印到命令行的函数,其前缀在运行时永远不会改变,所以我想在编译时设置它。像这样的东西: print_sp(常量字符...

回答 1 投票 0

如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?

我正在创建一个Matrix类,我希望能够使用initializer_list进行初始化,例如: 矩阵 mat = 矩阵{ {1,2},{3,...

回答 2 投票 0

如何访问封装在类中的未命名“枚举类”?

A类{ public: 枚举类 { HELLO, WORLD }; }; 知道在类内部声明一个简单的枚举(而不是枚举类)是一个更好的主意,因为它已经与类一起键入了

回答 2 投票 0

C++:不可变方法版本

在 C++11 中,提供方法的两个版本(一种用于修改对象本身,另一种用于返回修改后的副本)的最佳方式是什么? 例如,考虑一个具有“append(st...

回答 3 投票 0

在静态成员上使用构造函数违反了 C++ 多态性规则

在下面的代码中,我不确定为什么C++允许在Child virtual show定义中使用纯虚方法默认值。为什么编译器允许这样做?是否为静态成员

回答 1 投票 0

有没有办法从专门的构造函数调用模板构造函数?

假设我有这门课: 模板 班级测试 { 测试(T* x); 常量 T* 常量 t; 整数 i{0}; }; 我希望 t 始终用 x 初始化: 模板 测试 <...

回答 2 投票 0

在尝试使用 while 循环来推进我的代码时陷入困境

自上一篇文章以来,我对代码进行了彻底修改,到目前为止,我已经做到了这一点,但我需要从这里开始,我感到陷入困境。我犯的最后一个错误是有太多 if else 语句,而我没有......

回答 1 投票 0

如何告诉 std::future C++ 中是否存在 std::promise?

我创建一个 std::packaged_task,将其推送到 std::list 并将其 std::future 返回给用户,如下所示: future_t 安置(...) { //... 自动任务 = std::make_shared 我创建一个 std::packaged_task,将其推送到 std::list 并将其 std::future 返回给用户,如下所示: future_t emplace(...) { //... auto task = std::make_shared<std::packaged_task<return_t()>>( std::bind(std::forward<F>(f), std::forward<Args>(args)...)); tasks.emplace_back(task); std::future<return_t> result = task->get_future(); //... return result; } 在另一个线程中,我们可以随时清除任务列表: // another thread std::list<task_t> temp_{}; tasks.swap(temp_); 但是用户仍然可以调用 std::future: auto result = emplace(...); // do something and the tasks list has been clear in anthor thread auto ret = result.get(); 收到异常错误,因为 std::promise 已被破坏: C++ exception with description "std::future_error: Broken promise" thrown in the test body. 我可以使用异常表达式来避免程序崩溃: try { auto ret = result.get(); } catch (...) { } 我可以在没有异常表达的情况下避免std::future_error吗? 我的问题是:还有其他方法来检测 std::promise 是否存在吗? 恐怕没有直接的方法来检测承诺是否仍然存在。如果必须这样做,您可能需要做一些额外的工作来保持 task(或相应的 future)的状态,这比当前的解决方案更复杂。默认情况下,所有 future 均无效。每当您执行任务时,您都会将 future 标记为 valid。每当您要通过 future 获得结果时,请检查它是否有效。 注意:您必须处理此状态的同步,因为此状态在不同线程之间共享。这听起来很复杂,对吗?您将在成对的承诺和未来之外分享另一个数据。我不建议也不认为有必要这样做。 当您使用 std::promise 和 std::future 时,所有异常都应在 std::future::get 中处理。 要检查 future 是否有效,请使用“std::future:: valid”。如果给定的“future”与有效的共享状态相关联,则该函数返回 true,如果有人已经在该“future”上调用 get(),则 valid() 将返回 false 以获取更多信息,请遵循此链接“https://en.cppreference .com/w/cpp/thread/future/valid#:~:text=future%3A%3Avalid&text=检查%20if%20the%20future%20引用,或%20share()%20is%20调用。"

回答 2 投票 0

从《C++ 并发实践》一书中了解获取-释放示例

您能解释一下为什么断言会触发吗?我无法理解下面的解释。 if(y.load... 和 if(x.load... 都使用 std::memory_order_acquire。这还不够吗?书上写的是...

回答 1 投票 0

‘future’不是‘std’的成员

我想知道为什么我的编译器在测试以下代码时会抱怨: int main(int argc, char**) { ... std::future 结果( std::async([](int m, int n) { return m + n;} , 2,...

回答 1 投票 0

股息为负的除法,但四舍五入为负无穷大?

考虑以下代码(C++11 中): 整数a = -11,b = 3; int c = a / b; // 现在 c == -3 C++11 规范规定,除数为负数的除法将四舍五入为零。 很有用...

回答 5 投票 0

std::function 参数不允许为不完整类型

我正在尝试将 lambda 分配给 std::function,如下所示: std::function(推力::device_vector&) f; f = [](推力::device_vector & veh)->void { ...

回答 2 投票 0

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