相关疑难解决方法(0)

为什么 clang 使用 libstdc++ 删除包含 std::optional 的类型上的显式默认构造函数?

考虑以下结构,std::optional其中包含一个绝对具有“正常”默认构造函数的类型。

#include <optional>
#include <string>

struct Foo
{
    Foo() = default;
    const std::optional<std::string> m_value;
};

bool function()
{
    Foo foo;
    return bool(foo.m_value);
}
Run Code Online (Sandbox Code Playgroud)

使用 clang 9 编译以下内容(使用系统的默认值libstdc++,对于它的 gcc 8)会给出一个意外警告:

<source>:6:5: warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
    Foo() = default;
    ^
<source>:7:38: note: default constructor of 'Foo' is implicitly deleted because field 'm_value' of const-qualified type 'const std::optional<std::string>' (aka 'const optional<basic_string<char> >') would not be initialized
    const std::optional<std::string> m_value;
                                     ^
Run Code Online (Sandbox Code Playgroud)

Foo foo;由于它使用了所述已删除的构造函数,因此也存在硬错误。

  • 删除 …

c++ libstdc++ language-lawyer clang++ c++17

14
推荐指数
1
解决办法
266
查看次数

当显式初始化std :: optional时,我应该使用nullopt吗?

一个std::optional<T>可以被初始化到像这样的分离状态:

std::optional<int> oi { nullopt };
Run Code Online (Sandbox Code Playgroud)

但也像这样:

std::optional<int> oi { };
Run Code Online (Sandbox Code Playgroud)

并且类似地用于分配(oi = {}oi = nullopt).

除了个人偏好/美学意义之外,这些之间是否存在差异,这应该让我更喜欢一个?或者根本没关系?

注意:我问的是我想要显式初始化可选项的情况,而不是默认初始化它(例如强调).

c++ idiomatic optional c++17

6
推荐指数
2
解决办法
1822
查看次数

当 std::Optional 声明为局部变量且未显式初始化时,是否将其设置为 std::nullopt ?

当 anint被本地声明(但未初始化或赋值)时,它的值是未定义的。当std::optional<int>在本地声明而没有显式初始化时,是否同样适用?它总是std::nullopt,还是具有未定义的值?

c++ stl stdoptional

2
推荐指数
1
解决办法
1713
查看次数