问题标签 [stdoptional]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Get result into the caller from a function returning std::optional of std::vector
I am trying to manipulate the std::optional
using container like std::vector
.
I started by doing the code below :
The problem here is that I get nothing in the output: I guess that because std::optional::value
return a reference as in my case it is a reference to a temporary.
So to resolve that I tried to use std::reference_wrapper
as below :
Now I got a crash and an error :
- the crash happens when trying to add the string "name".
- the error is when I try to use the
for-range
loop sayingthe range for loop requires a suitable "begin" function and none was found.
The code below works but I don't like to declare a variable and then calli the Value():
So how could I return an std::optional holding a std::vector
in the way functionName().Value()
.
c++ - 尽管存在符号,但带有 std::experimental::optional 的未定义引用
在我正在处理的项目中摆弄了一堆 CMake 设置之后,我遇到了一个我以前没有遇到过的链接问题。
简而言之,我有一个静态库(.a
文件),其中包含以下符号(已解构):
但是当我尝试使用该方法将可执行文件与该文件和编译源链接时,我得到:
这是唯一且唯一的链接错误,即使我实例化 abuffer_pool
并使用了许多其他方法。另一方面,这也是该类拥有的唯一模板化方法。
考虑到库中存在符号,这种错误的潜在原因是什么?
到目前为止,我唯一的“线索”是,可选类的名称不同:std::experimental::optional
vs std::experimental::fundamentals_v1::optional
。这可能是原因吗?
笔记:
- 我问的是潜在原因,而不是实际原因(如果没有独立的示例,您将无法确定)。
- 为了安全起见,我显式地实例化了这个模板化方法。
- 编译使用 g++ 8.3.0,并且
/usr/bin/ld
是 2.32.51 。 - 我在 Devuan 3 Beowulf(~= Debian 10 Buster 没有 systemd)。
结果
/li>g++- v
:
c++ - std::optional 不可复制?
假设我有类似于这个伪代码的东西:
这是行不通的,基本上如果尝试使用真实代码会给出关于返回类型无法转换为的错误std::optional
。
解决这个难题的最佳方法是什么?
c++ - 如何在 if 语句中最好地测试和解包 std::optional
我有多个返回std::optional<T>
. 这是一个虚构类型的示例MyType
:
让我们假设这些函数的运行成本很高,我想避免多次调用它们。
当调用它们时,我想立即测试可选项,如果它确实包含一个值,我想立即使用它并且不再使用它。例如,在 Swift 中,我可以使用标准if-let
语句:
我想在 C++ 中复制这种测试和解包行为,同时在使用时保持代码尽可能干净。例如,显而易见的简单解决方案(至少对我而言)是:
但是您必须在 内展开if
,或*result
在任何地方使用,这与 Swift 无关。
到目前为止,我唯一真正接近 Swift 外观和感觉的解决方案是:
...但我也不喜欢使用宏来替换普通if
语句。
c++ - 我可以安全地获取指向未初始化的 std::optional 内容的指针以从二进制文件读入内存而不默认构造内容吗?
我正在重构一些遗留代码,它将文件中的一些二进制数据读取到结构中。我想到将变量更改为 std::optional 可以确保变量在使用之前实际读取(初始化)。但是文件读取代码需要变量的地址。有没有办法(一种预期的方式不是黑客)告诉 std::optional “给我一个指向你未初始化的T 的指针,这样我就可以写那个内存的内容”和“继续把你的状态从空更改为值- 现在满了”?
(也就是说,不是分配默认 T(如果 T 没有默认构造函数怎么办)然后获取默认构造值的地址。)
简化示例:
问题是如果我将成员更改std::optional<FILE_HEADER> fileHead;
为什么,那么我要为当前读取的行更改什么reader->read(&fileHead, sizeof(FILE_HEADER));
?
我可以这样做:
您之前可能已经反对,在 std::optional 中获取未初始化 T 的地址并将可选设置为不再为空的功能会冒着意外留下可选标记值的风险,而如果用户没有初始化,则仍然未初始化。 t 实际上写内存。但是请注意,上面的代码示例运行类似,尽管风险较小:如果 reader->read() 抛出,则可选项将不再为空,但也无法使用。默认构造的 T 可以说比未初始化的 T 更好,但是如果 FILE_HEADER 是 C 结构(在本例中是),它的成员仍然未初始化!
也许这样更好:
但这两者都涉及冗余初始化和/或复制(可能由编译器优化)。
c++ - 为 std::optional 禁用警告 C4324 是否安全?
我正在使用 flatbuffers - 一个序列化库。在该方案中,我定义了一个我想与 std::optional 一起使用的结构。但在编译期间我收到警告 C4324。我所了解的 flatbuffers 对生成的结构使用自定义填充。禁用警告是否安全?
警告信息是
Visual Studio 2017,msvc 14.13.26128。
c++ - 如何返回可选指针或引用( std::optional )?
假设我有以下模板函数:
我想要做的是返回一个可选的参考,但没有成功。我不知道如何从这里开始。这就是我想出的,最初我所拥有的是std::optional<const T*>
返回类型。
c++ - 标准::可选通过引用调用
我正在实现以下功能:
编译器说错误: 'const class std::optional' has no member named 'insert_sample'。
我了解该错误,但我无法找到有效的解决方案。如果我写
编译器说错误: 'const class std::optional' has no member named 'insert_sample'。我也尝试过 emplace() 和 value()。
如果有人可以帮助我,我将不胜感激。
好的,现在它可以工作了。正如评论中所建议的,我改为
并且界面必须是
谢谢!
c++ - 命名空间 std:: 不包含可选
我正在做 Vulkan 教程 https://vulkan-tutorial.com/
我从一个空项目开始,添加了包含和库;我可以在不包括 std::optional 的情况下编译和运行。
当我使用 std::optional 时,我得到 c2039“可选不是 std 的成员”
我正在运行 Windows 10 和 VisualStudio 2019
这里发生了什么 ?
谢谢。
c++ - 使用 std 可选与 shared_ptr 混合
我有两个派生类,如下所示。这是我现在拥有的简化设计版本。
A 类对象是可复制的,但它们很大。这就是我在derived_1 类的构造函数中使用引用的原因。
我将 shared_ptr 用于派生类 2 以使 p_a 的使用成为可选的。我注意到我也可以在派生类 2 的构造函数中使用 std::optional。通过这个,我可以向用户提示这个参数确实是可选的。
请注意,这是简化版本,并且此成员p_a
在所有三个类中都集中使用。在std::shared_ptr<A&>
实际示例中, a 也不是构造函数的唯一参数。如果您在这里向我展示如何正确使用 std::optional ,我将不胜感激。
可以将 std::optional 与 std::shared_ptr 混合吗?