考虑一个在运行时仅包装某个值的类:
template <typename Type>
class NonConstValue
{
public:
NonConstValue(const Type& val) : _value(val) {;}
Type get() const {return _value;}
void set(const Type& val) const {_value = val;}
protected:
Type _value;
};
以及它的constexpr版本:
template <typename Type>
class ConstValue
{
public:
constexpr ConstValue(const Type& val) : _value(val) {;}
constexpr Type get() const {return _value;}
protected:
const Type _value;
};
问题1:您能确认constexpr版本的设计是否正确吗?
问题2:如何将两个类混合成一个名为Value
的单一类,该类可以在编译时或运行时进行constexpr
构造,并且其值可以在运行时或编译时使用get()
函数获取?
编辑:
问题3:如果get()
在.cpp
文件中定义,如果我希望get()
在不是constexpr
的情况下内联,那么函数的正确声明是什么?是
constexpr inline Type get();
或者inline constexpr Type get()
还是其他什么?
constexpr
函数可以在编译时或运行时调用。 - chrisconstexpr
成员函数存在缺陷,因为它们总是暗示着一个const
函数限定符,即constexpr foo bar();
与constexpr foo bar() const;
是相同的声明。对于非成员函数没有这样的要求,即constexpr foo bar(T&)
;或constexpr foo bar(T&&);
都可以接受非常量的T
(并且可能涉及到非常量限定的类类型的常量表达式)。所以要注意这一点。 - Luc Dantonconstexpr
函数可以是非const
的,因为在对象被创建并且它的生成“值”处于constexpr
上下文中(显式或放入模板中)之前,该对象仍处于流动状态,并且容易被修改。直到这一点,用于该对象的函数调用必须是const
的。 - Adrian