c++ - 使用枚举 vs 变量,存储非类型模板参数值。(在 Int2Type 内模板)
问题描述
通过Andrei Alexandrescu 的Modern C++ Design,我无法理解使用 unnamed, unscopedenum
来存储非类型参数的原因。为什么不直接使用变量。
它有什么优点吗?
template <int v>
struct Int2Type
{
enum { value = v }; //why not use int value = v; which compiles fine
};
额外(如果有帮助):该模板旨在用作“类型生成器”以在编译时选择不同的函数。
解决方案
enum
使用而不是static const int
或 C++11的主要原因static constexpr int
是枚举为您提供了真正的纯右值,非常类似于字面量 int。当 ODR 问题出现时,这一点变得很重要。
例如,以下代码可以正常工作(完整示例):
void foo(const int& x) {
std::cout << "X: " << x;
}
struct V {
enum {value = 42; }
};
void bar() {
foo(V::value);
}
另一方面,以下结构的定义表现出未定义的行为(违反 ODR):
struct V {
static const int value = 42;
// same with static constexpr int value = 42;
};
这样做的原因是对值的绑定引用(在调用时foo
)ODR-在它是 const 成员时使用值。必须定义所有 ODR 使用的变量。
但是,由于引用不能绑定到枚举成员(和文字),因此会创建一个临时对象,引用绑定到该临时对象,因此无需定义任何内容。这是一个非常有用的功能。
推荐阅读
- c# - 错误 CS0246:找不到类型或命名空间名称“PHFetchOptions”(您是否缺少 using 指令或程序集引用?
- javascript - mapStateToProps 在最顶部的元素中导致奇怪的警告?
- xamarin - 错误 CS0534:[java 类] 未实现继承的抽象成员 'AsyncTask.DoInBackground(params Object[])'
- python - 嵌入python时Applescript输出读取问题
- html - Index.html 为空并显示 0bytes 但网页正在加载
- google-cloud-firestore - 如何允许身份验证部分下具有特定用户 UID 的用户写入 Firestore 并让其他用户读取特定文档的数据?
- python - 在 for 循环结束后不保留 Pandas DataFrames 中的更改
- pandas - 使用 panda 读取 .csv 并将单个列输出到单独的 .csv 文件中
- python - 如何在 selenium python 测试中设置等待条件
- json - 如何在laravel的特定字段下显示json响应?