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

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

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

编辑

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

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

相关文章:

C++11、shared_ptr.reset() 和循环引用

c++ - 让模板部分特化与通用实例化共享成员函数

c++ - 使用宏来缩写长篇大论的 boost 模板名称是一种不好的做法吗?

visual-c++ - 如何使用运行对象表 (ROT) 在两个 COM 对象之间进行通信?

c++ - 交叉数据结构

c++ - 为每个可变参数模板参数和一个数组调用一个函数

c++ - vector (具有 vector 的结构)

c++ - shm_unlink 的预期行为?

c++ - 如何衡量 C++ (MFC) 应用程序的性能?

c++ - 使用 MS 编译器的 std::cout 非常慢