我可以从constexpr函数返回一个可选项吗
Can I return an optional from a constexpr function?
- 我可以从
constexpr
函数返回optional
吗 - 为什么
- 如果是,它是如何工作的
我对boost::optional
和std::optional
都感兴趣。他们的行为一样吗?
boost::optional
不能由constexpr
函数返回。或者至少,文档对此没有提供任何保证。
但是,std::optional
,如已接受的C++14建议所定义的,可以由constexpr
函数返回。但是只有如果optional
的类型参数是平凡可破坏的。
这使得std::optional
的析构函数在这些情况下是微不足道的。在这一点上,销毁对象并不困难,因此没有什么可以阻止std::optional
成为一个文字类型。
这个建议在这方面很明确。如果T
是平凡可破坏的,那么optional
的大多数构造函数将是constexpr
,而optional<T>
将是文字类型。因此,它可以在constexpr
函数中创建。
Boost。Optional不支持constexpr
,主要是因为它是在C++11发布之前编写的。
当前针对std::optional
的建议确实支持constexpr
,只要值类型T
是可破坏的。它之所以有效,是因为允许constexpr
构造函数用于联合(7.1.5p4(;编译器跟踪哪个联合成员被初始化,确保在编译时捕获访问脱离的可选值的未定义行为:
struct dummy_t {};
template <class T>
union optional_storage {
static_assert( is_trivially_destructible<T>::value, "" );
dummy_t dummy_;
T value_;
constexpr optional_storage(): dummy_{} {} // disengaged
constexpr optional_storage(T const& v): value_{v} {} // engaged
~optional_storage() = default;
};
值类型必须是可平凡破坏的,因为constexpr
只对文字类型有用,文字类型本身必须有一个平凡的析构函数。
例如,写入:
constexpr optional_storage<int> o{};
constexpr int i = o.value_;
gcc给出错误:
error: accessing ‘optional_storage<int>::value_’ member instead of initialized
‘optional_storage<int>::dummy_’ member in constant expression
相关文章:
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- 程序在使用 system() 启动另一个可执行文件时停止
- 通过样式表仅在QTabWidget中应用文本颜色一个特定选项卡
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 有一个可迭代的容器,其中的成员在编译时是已知的
- 如何拥有一个可由多种语言调用的C++库
- 从c++11 time_t创建一个可转换为.net DateTime的字符串
- 只有一个可执行文件即可进行跨平台 SIMD 调用?
- 构建一个可执行文件,如果是单个 cpp 文件
- 是否可以在C++中制作一个可调用自身的实函数类型?
- 如何维护类成员的顺序,并且仍然有一个可工作的构造函数
- 如何在C 中提供一个可呼叫的对象访问,例如lambda
- C++将各种资源文件链接到一个可执行文件中
- 如何在 ubuntu 上将可执行文件注入另一个可执行文件
- 'Continuous' C++一个可执行文件的输出作为另一个程序的输入
- 程序如何创建另一个可执行文件
- 是否有一个可视化 c++ 预定义的预处理器宏,让您知道编译器何时优化
- 使用一个可选参数获取两个参数到main
- 创建一个实现选项卡并可用作 QMainWindow 中的"central widget"的类
- 我可以从constexpr函数返回一个可选项吗