如果这是一个无知的问题,请原谅我,但我仍然在思考何时以及如何使用 constexpr
说明符。 (使用 msvc 14 编译)。
我正在开发一个简单的基类,它允许您将任意对象包装到“constexpr 对象”中。它看起来像这样:
template<typename T>
class basic_const {
public:
explicit constexpr basic_const(const T& value) : data_(value) { }
template <typename...Args>
constexpr basic_const(Args&&...args) : data_(T(std::forward<Args>(args)...)) { }
virtual ~basic_const() = default;
constexpr const T& data() const noexcept { return data_; }
private:
T data_;
};
一切都按预期进行,我可以成功创建一个可以(显然)符合 constexpr
资格的任何类型的对象。
问题是这样的:
当尝试从此类继承时,我无法实现其他 constexpr
成员函数,但我可以实现。以下代码适用于我正在实现的 constexpr
字符串类:
class str_const : public basic_const<const char*>
{
public:
template <std::size_t N>
constexpr str_const(const char(&str)[N]) :
basic_const(str), sz_(N) {}
...
constexpr std::size_t size() const noexcept{ return sz_; } // error here
...
public:
std::size_t sz_;
};
我可以在派生类中创建 constexpr 成员函数吗?
最佳答案
问题似乎不是你在 your answer 中写的。问题是封闭类不是 literal type ,由于虚拟析构函数的存在(即 non-trivial destructor )。 gcc 吐出(强调我的):
error: enclosing class of constexpr non-static member function 'std::size_t str_const::size() const' is not a literal type
从析构函数中删除virtual
限定符,它将起作用。
成员变量不需要额外的 const。
编辑
clang然而compiles your code just fine ...想知道这是否是一个错误。现在意识到这确实是一个 clang bug,如 virtual destructor is non-trivial ,因此 clang 不应按原样编译您的代码。
关于c++ - 在派生类的函数中使用 Constexpr 说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36535774/