Простите меня, если это неосведомленный вопрос, но я все еще обнимаю голову, когда и как использовать спецификатор constexpr
. (компиляция с msvc 14). Я работаю над простым базовым классом, который позволяет обернуть произвольный объект в «объект constexpr». Это выглядит следующим образом:Использование спецификатора 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 функции члена в производном классе?
спасибо, прояснилось немного! –
@NowhereMan Добро пожаловать, хороший вопрос. Я все еще пытаюсь придумать минимальный пример для заполнения ошибки clang. – vsoftco
Ограничение, которое функции constexpr-члена могут быть объявлены только для литеральных типов, было ограничением C++ 11, задним числом снятым с C++ 11 с CWG1684 и полностью удаленным из C++ 14. GCC здесь не прав, Клэнг прав, и, таким образом, этот ответ неверен. ; -D (EDIT: конкретная формулировка, которая была изменена, была в [dcl.constexpr]/8; предложение «* Класс, членом которого является эта функция, является литеральный тип. *» Был удален.) – ildjarn