模板),c++,c++11"/>

首页 > 解决方案 > 使用枚举 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
};

额外(如果有帮助):该模板旨在用作“类型生成器”以在编译时选择不同的函数。

标签: c++c++11

解决方案


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 使用的变量。

但是,由于引用不能绑定到枚举成员(和文字),因此会创建一个临时对象,引用绑定到该临时对象,因此无需定义任何内容。这是一个非常有用的功能。


推荐阅读