- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为初始化 std::optional
与 std::nullopt
与默认构造相同。
They are described as equivalent at cppreference ,如式(1)
但是,Clang 和 GCC 似乎都以不同的方式对待这些玩具示例函数。
#include <optional>
struct Data { char large_data[0x10000]; };
std::optional<Data> nullopt_init()
{
return std::nullopt;
}
std::optional<Data> default_init()
{
return {};
}
Compiler Explorer seems to imply使用 std::nullopt
将简单地设置一个字节“has_value
”标志,
nullopt_init():
mov BYTE PTR [rdi+65536], 0
mov rax, rdi
ret
默认构造将对类的每个字节进行值初始化。这在功能上是等效的,但几乎总是更昂贵。
default_init():
sub rsp, 8
mov edx, 65537
xor esi, esi
call memset
add rsp, 8
ret
这是故意行为吗?什么时候应该首选一种形式而不是另一种形式?
<小时/>更新:GCC(自 v11.1 起)和 Clang(自 v12.0.1 起)now treat both forms efficiently.
最佳答案
在本例中,{}
调用值初始化。如果可选的默认构造函数不是用户提供的(其中“不是用户提供的”大致意思是“在类定义中隐式声明或显式默认”),则会导致整个构造函数的零初始化对象。
是否这样做取决于特定std::Optional
实现的实现细节。看起来 libstdc++ 的 可选
的默认构造函数不是用户提供的,但 libc++ 是。
关于c++ - std::可选 - 使用 {} 或 std::nullopt 构造空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964217/
考虑以下代码示例 #include #include std::experimental::optional dflt(42); template& Dflt> void foo() {
这个问题在这里已经有了答案: Why is std::nullopt_t part of the C++ standard? (3 个回答) 去年关闭。 当我们可以使用统一初始化轻松地默认构造一个 s
为什么我不能使用 nullptr 而不是 nullopt?为什么 {} 翻译成 nullopt? 最佳答案 Why can't i use nullptr instead of nullopt? 因为
背景 我有一系列 lambda 表达式,它们对捕获的变量执行不同的检查并返回 std::nullopt如果检查失败。 return std::nullopt是第一个返回语句。然后,如果检查成功,他们将
我认为初始化 std::optional与 std::nullopt与默认构造相同。 They are described as equivalent at cppreference ,如式(1) 但
我已经将第三方项目的一些代码片段导入到我的 C++11 项目中。第三方项目使用 optional-lite [1],尽管我在项目中大量使用 Boost 并希望保持对其他库的依赖性较低。 有 boost
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
C++14 为我们提供了自动返回类型推导,而 C++17 有一个 optional。类型模板(或类型构造函数,如果你愿意的话)。现在,真的,optional存在于标准库中,而不是语言本身,但是-当控制
我需要编写一个函数来获取 optional 的所有权的底层数组。 在Rust中,是这样实现的: fn my_func(f: &mut Option>) -> Box { //how to d
我是一名优秀的程序员,十分优秀!