【问题标题】:Using Constexpr specifier in a derived class's function在派生类的函数中使用 Constexpr 说明符
【发布时间】:2016-04-10 21:31:04
【问题描述】:

如果这是一个无知的问题,请原谅我,但我仍在纠结何时以及如何使用 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 成员函数,但我可以 ctors。以下代码用于我正在实现的 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 成员函数吗?

【问题讨论】:

    标签: c++ c++11 visual-c++ c++14 constexpr


    【解决方案1】:

    问题似乎不是你在your answer 中写的。问题是封闭类不是literal type,因为存在虚拟析构函数(即non-trivial destructor)。 gcc 吐出(强调我的):

    错误:constexpr 非静态成员函数'std::size_t str_const::size() const'的封闭类不是文字类型

    Live example with the error

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

    Live example working

    成员变量不需要额外的consts。

    编辑

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

    【讨论】:

    • @NowhereMan 不客气,好问题。我仍在尝试想出一个最小的例子来填补一个铿锵的错误。
    • constexpr 成员函数只能为文字类型声明的限制是 C++11 的限制,从 CWG1684 的 C++11 追溯解除,并从 C++14 完全删除。 GCC 在这里是错误的,Clang 是正确的,因此这个答案是错误的。 ;-D(编辑:更改的具体措辞在 [dcl.constexpr]/8 中;删除了“该函数所属的类应为文字类型。”这句话.)
    • @ildjarn 我认为您应该发布答案而不是评论。我绝对没有深入挖掘,所以一个完整的答案可能是有益的。
    【解决方案2】:

    看来我正在尝试完成的事情是完全可以接受的,派生类中的成员变量没有声明const,将基类和派生类中的变量都更改为const 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 2019-04-17
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多