rvalue 引用和模板参数

rvalue References and Template parameters

本文关键字:参数 引用 rvalue      更新时间:2023-10-16

为什么不允许使用这种语法:

template<float&& value>
struct MyStruct{
  float GetValue() { return value; }
};
MyStruct<12.1f> myFloat;

相反,我们必须这样做:

template<const float& value>
struct MyStruct{
  float GetValue() { return value; }
};
extern constexpr float param = 12.1f;
MyStruct<param> myFloat;

我看不出有什么理由禁止第一个。
第一种语法远没有那么笨拙,第二种语法只是让 c++ 的创建者看起来只是想让事情变得困难......那么为什么会这样呢?

由于模板处理非常复杂,我认为设计人员正确地拒绝了使用其他方法可以轻松完成的功能。 模板参数的存在是为了自定义代码的行为,而不仅仅是插入常量。 这就是支持 int 模板参数的原因,因此您可以执行以下操作:

template <int SIZE> struct X {
    char buffer[SIZE];
};

如果只想在类的实例中提供一个常量,请将其添加到构造函数中:

class X {
public:
    X(float value_) {
        value = value_;
    }
    float value;
};

如果你真的想要一个使用该常量的自定义类,那么:

class X71 : public X {
public:
    X71() : X(7.1f) {}
};