constexpr相关内容
C++标准要求编译器在C++常量计算中检查未定义的行为。 在this talk中,Chandler Carruth指出,在检查UB时“您将耗尽检测错误的能力”,而且在一般情况下,检测UB与halting problem相关,因此可以证明无法确定。 他指的不是conexpr中的UB,但conexpr计算从C++14开始就像常规程序一样通用,因此这仍然适用。 那么,当编译器无法确定程
..
尝试创建constexprstd::string和std::vector对象时遇到奇怪的编译器错误: #include #include int main() { constexpr std::string cs{ "hello" }; constexpr std::vector cv{ 1, 2, 3 }; return 0;
..
我想在C++20中创建一个广泛的constexpr数据存储库。数以万计的本机C++对象作为&q;文本段&即请求分页加载到进程中并在实例之间共享(生成代码)。 对象相互引用,需要通过各种属性、交叉引用等进行索引,所有这些都希望在编译时完成。这需要constexpr(关联)容器,但不能使用模板化(按大小、散列大小等)完成。容器,因为一切都需要保持多态。 首先这似乎是不可能的,因为C++20
..
我知道需求的不同,我最感兴趣的是它带来的代码质量带来的好处。 我能想到的几件事: 读者只需阅读函数签名即可知道该函数是在编译时计算的 编译器可能会发出较少的代码,因为constevalFN从不在运行时使用(这只是推测,我没有这方面的真实数据) 不需要有变量来强制ctfe,最后的示例 注意:如果代码质量太模糊,我理解有些人可能想结束这个问题,对我来说,代码质量并不是那个模糊的术
..
我知道,在编译时复制任意内存块并不总是可能的,但既然我们得到了stexpr常量、虚方法和算法,为什么不能也复制emcpy呢?它也是一种算法。 更多, C++20std::bit_cast看起来很像std::memcpy解决办法reinterpret_cast,但它确实是constexpr。 std::copy对于C++20,使用迭代器被标记为constexpr,因此可以以某种方式复制
..
以下代码: struct S { static constexpr int rolling_sum[4]{ 0, rolling_sum[0] + 1, rolling_sum[1] + 2, rolling_sum[2] + 3 }; }; 被clang接受(版本12测试),但被GCC拒绝(版本11测试),
..
我需要在编译时确定元组的某个索引元素的偏移量。 我尝试了此函数,从https://stackoverflow.com/a/55071840/225186(接近尾声)复制, template constexpr std::ptrdiff_t element_offset() { Tuple p; return
..
作为 constexpr std::字符串和constexpr std::vector 已被 C++20 接受,这些将如何使用?链接的论文在细节上非常短.我们是否需要指定特殊的 constexpr 分配器,使编译时字符串/向量与其正常等效项不兼容? 解决方案 这两篇论文严重依赖P0784,其中讨论了编译时分配的工作方式. 不完整的答案: 只有 std::allocator 可以
..
我正在尝试使用指向 int 的指针初始化 constexpr 声明,该指针是一个 const 对象.我也尝试用非 const 类型的对象来定义对象. 代码: #include 主函数(){constexpr int *np = nullptr;//np 是一个指向 null 的 int 常量;整数 j = 0;constexpr int i = 42;//i 的类型是
..
..
以下定义有区别吗? const double PI = 3.141592653589793;constexpr 双 PI = 3.141592653589793; 如果不是,C++11 中首选哪种风格? 解决方案 我相信是有区别的.让我们重命名它们,以便我们可以更轻松地讨论它们: const double PI1 = 3.141592653589793;constexpr 双 PI2
..
我正在使用 gcc 4.6.1,并且遇到了一些有趣的行为,涉及调用 constexpr 函数.该程序运行良好,并立即打印出 12200160415121876738. #include extern const 无符号长乔;constexpr unsigned long fib(unsigned long int x){返回 (x
..
templateconstexpr 内联T getClamped(const T& mValue, const T& mMin, const T& mMax){断言(mMin
..
当我想要一个静态指针作为类的成员时,我需要 constexpr 来使用 nullptr 进行初始化. 类应用程序{私人的:constexpr 静态 Application* app = nullptr;} 谁能解释我为什么需要这样做?我找不到静态变量必须在编译时存在的确切原因. 解决方案 那是因为你在类定义中初始化它.这只允许用于常量整数和枚举类型(总是)和 constexpr 数据成
..
我应该在哪里使用 macros,我应该在哪里使用 constexpr?不是基本一样吗? #define MAX_HEIGHT 720 对 constexpr unsigned int max_height = 720; 解决方案 他们不是基本一样吗? 没有.绝对不.甚至没有关闭. 除了你的宏是一个 int 而你的 constexpr unsigned 是一个 unsign
..
我正在用 g++-4.6.1 --std=c++0x 编译以下简单程序: #include 结构 S{静态 constexpr int X = 10;};主函数(){返回 std::min(S::X, 0);}; 我收到以下链接器错误: /tmp/ccBj7UBt.o:在函数“main"中:scratch.cpp:(.text+0x17): 未定义的对 `S::X' 的引用colle
..
作为免责声明,我在询问之前已经对此进行了研究.我发现了一个类似的问题,但那里的答案感觉有点“稻草人"并没有真正为我个人回答这个问题.我还提到了我方便的 cppreference 页面 但这并没有提供大多数时候对事情的解释非常“愚蠢". 基本上我仍然在加强 constexpr,但目前我的理解是它需要在编译时评估表达式.由于它们可能仅在编译时存在,因此它们在运行时不会真正拥有内存地址.因此,当我
..
据我所知,一个很常见的情况是这样的 template班级{上市:静态 constexpr int I = i;静态 constexpr int J = constexprFunction(i);//进一步的类实现}; 几乎和我一样常见的错误(实际上我在这里的大部分问题都是因为我忘记了它并且不知道正确的问题是什么)如果成员被 odr 使用,则忘记了附加定义: templateconstexpr
..
如果我在一个函数中有一个变量(比如一个大数组),将它同时声明为 static 和 constexpr 是否有意义?constexpr 保证数组是在编译时创建的,那么 static 会无用吗? void f() {静态 constexpr int x [] = {//几千个元素};//对数组做一些事情} static 在生成的代码或语义方面真的在做什么吗? 解决方案 简短的回答是 sta
..
我有以下示例代码 template班级操作{上市:constexpr 操作(const T1& lhs, const T2& rhs) noexcept: m_lhs(lhs), m_rhs(rhs) { }私人的:const T1&m_lhs;const T2&m_rhs;};int main(){constexpr int a = 3;constexpr int b = 4;constexp
..