gpt4 book ai didi

c++ - 在派生类的函数中使用 Constexpr 说明符

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:48 34 4
gpt4 key购买 nike

如果这是一个无知的问题,请原谅我,但我仍在思考何时以及如何使用 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

Live example with the error

从析构函数中删除 virtual 限定符,它将起作用。

Live example working

成员变量不需要额外的const

编辑

然而,铿锵 compiles your code just fine ...想知道这是否是一个错误。现在意识到这确实是一个 clang 错误,作为 virtual destructor is non-trivial ,因此 clang 不应按原样编译您的代码。

关于c++ - 在派生类的函数中使用 Constexpr 说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36535774/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com