constexpr 相关问题

constexpr是C ++ 11中引入的修饰符,它通知编译器函数或变量的值是已知的,或者可以在编译时计算。因此,它可以在不可能的地方用作常数。

更多在堆栈上分配任意空间的非标准方法

目前,我正在使用 gcc,它允许在 C++ constexpr 函数中使用 C 可变长度数组(不要问我为什么)。当然,这不是标准行为,但会导致设计...

回答 1 投票 0

带参数化构造函数的 C++ 静态分配

我想使用编译时分配(静态分配)通过其参数化构造函数来分配类的对象。传递的参数是编译时常量,它...

回答 1 投票 0

lambda 函数/表达式支持 constexpr 吗?

结构测试 { 静态常量 int 值 = []() -> int { return 0; } (); }; 使用 gcc-4.6 我得到类似错误:函数需要为 constexpr 的信息。我尝试过多种推杆组合

回答 5 投票 0

如何让 MSVC 在 c++20 编译时查看静态 constexpr 成员变量和函数?

背景 我试图在编译时在 CRTP 类中访问 constexpr 变量。下面是一个 MVCE。 模板 结构体CRTP { 静态 constexpr int get_va...

回答 1 投票 0

条件定义变量(static if)

在多种情况下,我想使用类似的东西 模板 结构S { 整数值; if constexpr(条件) /*#if 条件*/ 双倍 my_extra_member_variable; /*#结束...

回答 1 投票 0

constexpr 用指针初始化

我正在尝试使用指向 int 的指针初始化 constexpr 声明,该指针是 const 对象。我还尝试使用非 const 类型的对象来定义对象。 代码: #包括 我正在尝试使用指向 int 的指针初始化 constexpr 声明,该指针是 const 对象。我还尝试使用非 const 类型的对象来定义对象。 代码: #include <iostream> int main() { constexpr int *np = nullptr; // np is a constant to int that points to null; int j = 0; constexpr int i = 42; // type of i is const int constexpr const int *p = &i; // p is a constant pointer to the const int i; constexpr int *p1 = &j; // p1 is a constant pointer to the int j; } g++ 日志: constexpr.cc:8:27: error: ‘& i’ is not a constant expression constexpr.cc:9:22: error: ‘& j’ is not a constant expression 我相信这是因为 main 中的对象没有固定地址,因此 g++ 向我抛出错误消息;我该如何纠正这个问题?不使用文字类型。 让他们static修复他们的地址: int main() { constexpr int *np = nullptr; // np is a constant to int that points to null; static int j = 0; static constexpr int i = 42; // type of i is const int constexpr const int *p = &i; // p is a constant pointer to the const int i; constexpr int *p1 = &j; // p1 is a constant pointer to the int j; } 这称为 地址常量表达式 [5.19p3]: 地址常量表达式是纯右值核心常量表达式 指针类型,计算结果为具有 static 的对象的地址 存储持续时间、函数地址或空指针 值,或 std::nullptr_t 类型的纯右值核心常量表达式。 #include <iostream> // define i/j outside the function body, as mentioned in the book "c++ primer" int j = 0; constexpr int i = 42; // type of i is const int int main() { constexpr int *np = nullptr; // np is a constant to int that points to null; constexpr const int *p = &i; // p is a constant pointer to the const int i; constexpr int *p1 = &j; // p1 is a constant pointer to the int j; }

回答 2 投票 0

C++ 在 constexpr 中合成链表

我有以下问题,考虑这样的链表: 结构元素{ 结构元素* const next; // 这里需要const constexpr Car(结构元素* _nxt) :下一个(_nxt) { } ...

回答 1 投票 0

如何在 constexpr 表达式中从 const void* 进行转换?

我正在尝试将 memchr 重新实现为 constexpr (1)。我没有预料到会出现问题,因为我已经用 strchr 成功地完成了同样的事情,这非常相似。 然而 clang 和 gcc 都拒绝......

回答 2 投票 0

C++14 我应该多久使用一次 constexpr?

我一直在读一本关于C++14/11的书。我刚刚读完关于 constexpr 关键字的一章。我知道它的用途,但我应该多久使用一次 constexpr?我应该在代码中使用它吗...

回答 2 投票 0

只要进程处于活动状态,const char* 文字字符串就会持久存在吗?

我有如下功能: const char* get_message() { return "这是一条恒定的消息,不会永远改变!"; }; const char* get_message2() { 返回“消息...

回答 4 投票 0

只要进程处于活动状态,指向字符串文字的 const char* 是否就持久存在?

我有如下功能: const char* get_message() { return "这是一条恒定的消息,不会永远改变!"; }; const char* get_message2() { 返回“消息...

回答 2 投票 0

只要进程处于活动状态,const char* 字符串就会持久存在吗?

我有如下功能: const char* get_message() { return "这是一条恒定的消息,不会永远改变!"; }; const char* get_message2() { 返回...

回答 2 投票 0

有状态但“constexpr”的 lambda 不能用作非类型模板参数吗?

不知何故,我仍然认为 lambda 是常规函数对象的“语法糖”,因此令我惊讶的是,在 C++-20 下,无法使用有状态但在其他方面为 constexpr 的 lambda 实例...

回答 1 投票 0

有没有办法在 Eclipse CDT 中语法高亮 constexpr 变量?

当我创建一个枚举时,它的成员在我的代码中以蓝色和斜体显示。我想要类似的 constexpr 变量(C++ 14 或更高版本)。这可能吗?

回答 1 投票 0

constexpr 成员函数给出 C2131

我已经理解了 const 和 constexpr 及其应用程序之间的区别,但我无法得到以下错误: // .hpp 文件 类我的类{ 民众: constexpr 双平方(双

回答 1 投票 0

C++ if constexpr 使用 constexpr bool 相当于普通 if?

考虑到正在检查的条件变量已标记为 constexpr,以下代码片段在功能上是否等效? 另外,这是 if constexpr 的正确用法还是它在...

回答 1 投票 0

您可以在 C++20 constexpr 构造函数中隐式激活 union 的数组成员吗?

我正在使用 C++20,并且有一个包含透明联合的结构,其中包含数组。我需要我的结构有一个 constexpr 构造函数,但我想避免填充整个 arr...

回答 1 投票 0

在同一类中使用 constexpr 作为模板参数时出错[重复]

如果我尝试编译以下 C++0x 代码,则会收到错误: 模板 struct foo { }; 结构栏{ 静态 constexpr int number() { return 256; } 无效函数(foo 如果我尝试编译以下 C++0x 代码,则会收到错误: template<int n> struct foo { }; struct bar { static constexpr int number() { return 256; } void function(foo<number()> &); }; 使用gcc 4.6.1,错误消息是: test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition test.cc:6:28: note: in template argument for type ‘int’ 使用 clang 2.8,错误消息是: test.cc:6:20: error: non-type template argument of type 'int' is not an integral constant expression void function(foo<number()> &); ^~~~~~~~ 1 error generated. 如果我将 constexpr 函数移至基类,它可以在 gcc 上运行,并在 clang 上给出相同的错误消息: template<int n> struct foo { }; struct base { static constexpr int number() { return 256; } }; struct bar : base { void function(foo<number()> &); }; 代码是否错误,或者是 gcc 4.6 对 C++0x 实现的限制或错误?如果代码是错误的,为什么是错误的,C++11标准的哪些条款说它是错误的? 在 C++ 中,类的成员函数的内联定义仅在解析类中的每个声明后才会解析。因此,在第一个示例中,编译器在声明 number() 时看不到 function() 的定义。 (没有发布的 clang 版本支持评估 constexpr 函数,因此您的任何测试用例都无法在那里工作。) 这将编译成功: struct Sub{constexpr Sub(int i){}}; struct Test{ static constexpr Sub s=0; };

回答 2 投票 0

constexpr 组合评估失败

我尝试使用 constexpr 并尝试将 ipv4 地址解析为四位数字,但它不起作用。所以我将代码精简到失败的地方: #包括 #包括 我尝试使用 constexpr 并尝试将 ipv4 地址解析为四位数字,但它不起作用。所以我将代码精简到失败的程度: #include <cstdint> #include <stdexcept> #include <string_view> #define WORKS 1 static constexpr uint8_t getIpVal(const std::string_view &sv) noexcept { size_t pos = 0; auto len = sv.size(); unsigned long val = 0; while (sv[pos] >= '0' && sv[pos] <= '9' && pos < len) { int digit = sv[pos] - '0'; val *= 10; val += digit; if (val > UINT8_MAX) { return 0; // throw std::invalid_argument(sv.data()); } ++pos; } if (pos < len) { return 0; // throw std::invalid_argument(sv.data()); } return val; } static constexpr auto operator""_ipv4(const char *ipv4Ptr, const size_t size) { const std::string_view ipv4Str(ipv4Ptr, size); const auto pos1 = ipv4Str.find('.'); if (pos1 == std::string_view::npos) { throw std::invalid_argument(ipv4Ptr); } const auto str1 = ipv4Str.substr(0, pos1); #if WORKS return str1; #else return getIpVal(str1); #endif } auto test1() { return "127.0.0.1"_ipv4; } auto test2() { return getIpVal("127"); } 我正在尝试使用编译器资源管理器来编译它:https://godbolt.org/z/aY3ETo6ba 只要将 WORKS 定义为 1,一切似乎都工作正常: .LC0: .string "127.0.0.1" test1(): mov eax, 3 mov edx, OFFSET FLAT:.LC0 ret test2(): mov eax, 127 ret 但是如果我将其设置为零,编译器将创建一个完整的代码,其中包含一个循环来计算该数字。我不懂为什么。 单个功能似乎有效,但组合起来却失败了。在我看来,它应该只创建两个带有数字的函数: test1(): mov eax, 127 ret test2(): mov eax, 127 ret 您的缓冲区溢出了。您在调用string_view::operator[]后检查索引是否太大: while (sv[pos] >= '0' && sv[pos] <= '9' && pos < len) // Fixed: while (pos < len && sv[pos] >= '0' && sv[pos] <= '9')

回答 1 投票 0

constexpr指针如何存在并且constevel函数在编译时返回指针?

我正在浏览 constexpr 和 consteval 的主题,发现以下内容, 我们可以拥有 CONSTEXPR 类型的指针 CONSTEVAL 函数可以返回 CONSTEXPR 变量的指针 一个...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.