能否用Structured Binding定义可用于常量表达式的常量?如何实现?
用结构化绑定定义可用于常量表达式的常量可行吗?
答案是可以,但不能像你写的const auto [ file_type, folder_type, sym_type ] = 42u, 43u, 44u ;那样直接写——结构化绑定要求右侧是单个聚合类型对象(比如数组、std::tuple、简单结构体),不能直接绑定多个独立字面量。正确操作方式如下:
核心要求
要让绑定后的变量成为常量表达式,必须保证:
- 右侧的聚合对象是
constexpr的 - 结构化绑定本身也声明为
constexpr(C++17及以后支持)
具体实现方案
方案1:绑定到constexpr std::tuple
#include <tuple> // 先定义一个constexpr的tuple存储常量值 constexpr auto type_values = std::tuple{42u, 43u, 44u}; // 用constexpr结构化绑定拆分出各个常量 constexpr auto [file_type, folder_type, sym_type] = type_values; // 可以直接在switch的case分支中使用 void process_type(unsigned int type) { switch (type) { case file_type: // 处理文件类型逻辑 break; case folder_type: // 处理文件夹类型逻辑 break; case sym_type: // 处理符号链接类型逻辑 break; } }
方案2:绑定到constexpr数组
如果不需要std::tuple的特性,用数组更轻量化:
// 定义constexpr数组 constexpr unsigned int type_values[] = {42u, 43u, 44u}; // 结构化绑定拆分 constexpr auto [file_type, folder_type, sym_type] = type_values;
关键说明
- 必须加
constexpr:只有constexpr的结构化绑定,得到的变量才是编译期常量,才能满足switch的case分支对常量表达式的要求。 - 聚合类型限制:结构化绑定仅支持聚合类型或能被
std::get访问的类型(比如std::tuple),不能直接绑定多个分散的字面量。
内容的提问来源于stack exchange,提问作者Wasfi JAOUAD
相关产品推荐
相关产品推荐

