C++ Constexpr typedef

C++ Constexpr typedef,c++,typedef,constexpr,C++,Typedef,Constexpr,不幸的是,您不能这样做: typedef constexpr int cint; 这并不是世界末日……每次需要使用constexpr时,只需键入额外的9个字符(如果包含空格,则为10个) 但是我已经创建了一个类,我只希望能够创建这个类的constexpr版本(使用非constexpr版本没有任何意义) 所以我的计划是用一个不可访问的名称空间创建类,然后在我的主名称空间中创建一个consteprtypedef,如下所示: namespace MainNameSpace{ namespace

不幸的是,您不能这样做:

typedef constexpr int cint;
这并不是世界末日……每次需要使用
constexpr
时,只需键入额外的9个字符(如果包含空格,则为10个)

但是我已经创建了一个类,我只希望能够创建这个类的constexpr版本(使用非
constexpr
版本没有任何意义)

所以我的计划是用一个不可访问的名称空间创建类,然后在我的主名称空间中创建一个
constepr
typedef,如下所示:

namespace MainNameSpace{
  namespace detail{
    class MyClass{};

  }
  typedef constexpr detail::MyClass MyClass;
}

不幸的是,我发现这是无法做到的……有没有任何方法可以达到类似的效果(不使用宏)?

typedef constexpr detail::MyClass MyClass没有多大意义。您正在建立一个契约,即
MyClass
是一个有效的
constexpr
类,并且您将只在
constexpr
上下文中使用它,但编译器无法保证仅凭该语句就可以……这一切归结为
MyClass
是如何实现的,以及您在什么上下文中使用它。这是多余的,没有意义的。如果您对“编译时字符串类”感兴趣,请看一看。

这可能在C++20中使用说明符实现

我还不能运行测试,但我认为您可以在
MyClass
中编写立即构造函数,或者编写一个立即函数,只将
MyClass
的实例创建为常量表达式

//立即构造函数
类MyClass{
consteval MyClass();
consteval MyClass(const MyClass&);
};
//或立即瞬变函数
consteval MyClass make_MyClass();

constexpr
不是类型系统的一部分。它是表达系统的一部分,也就是价值观的本质。@KerrekSB我发现使用非constexpr版本的艰难方式没有任何意义
constexpr版本有什么意义?你希望它能做什么?@deviantfan我设计了一个专门用于编译时字符串的类…如果我想使用非
constexpr
版本,我可能试图使用普通字符串,或者我只是忘记了键入它…我想知道是否有任何方法可以避免这种情况mistake@DarthRubik: “如果我想使用非constexpr版本,我可能会尝试使用普通字符串”为什么?静态字符串可能不会分配堆空间。这听起来是一个很好的理由,即使在合理的情况下,也可以在运行时使用。