2016-05-29 3 views
2

определение типа во К сожалению, вы не можете сделать что-то вроде этого:Constexpr

typedef constexpr int cint; 

И это не конец света .... просто надо впечатать дополнительные 9 (10, если вы включите пространство) символов каждый раз, когда вам нужно использовать constexpr.

Но я создал класс, и я хочу только иметь возможность создавать constexpr версию этого класса (используя не constexpr версии не имеют никакого смысла).

Так что мой план был создать класс с не доступным пространством именами, а затем создать в своем основном пространстве с constexpr ЬурейиМ, например, так:

namespace MainNameSpace{ 
    namespace detail{ 
    class MyClass{}; 

    } 
    typedef constexpr detail::MyClass MyClass; 
} 

К сожалению, я обнаружил, что это не может быть сделано ... . Есть ли способ достичь аналогичного эффекта (без использования макросов)?

+5

'constexpr' не является частью системы типов. Это часть системы * expression *, т. Е. Характера * значений *. –

+0

@KerrekSB Я обнаружил, что трудный путь – DarthRubik

+1

'использование версии non constexpr не имеет никакого смысла. Как версия constexpr имеет смысл? Что вы ожидаете от этого? – deviantfan

ответ

0

typedef constexpr detail::MyClass MyClass; не имеет смысла. Вы устанавливаете контракт, что MyClass является допустимым классом constexpr, и вы будете использовать его только в контекстах constexpr, но компилятор не может гарантировать, что только этим утверждением ... все сводится к тому, как реализовано MyClass и в каких контекстах вы его используете. Это избыточно и бессмысленно. Если вас интересует «класс строки времени компиляции», взгляните на string_view.

Смежные вопросы