constexpr 相关问题

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

在 C 中编译时填充数组

我有一些嵌入式 C 代码,我想要一个正弦值列表。我在 C++ 中使用 constexpr 函数做了类似的事情,该函数在主循环之外返回 std::array : #包括...

回答 1 投票 0

为什么 std::vector::at 不能在使用范围的 for-each 循环中工作?

这是我尝试在 C++26(我知道,没有发布,但这是我给 gcc 的选项)和 GCC 14.2 中的编译时解析器实现的简化示例。 #包括 #包括 这是我尝试在 C++26(我知道,没有发布,但这是我给 gcc 的选项)和 GCC 14.2 中的编译时解析器实现的简化示例。 #include <iostream> #include <ranges> #include <string_view> #include <vector> using namespace std::string_view_literals; template <class To> inline constexpr auto static_caster = []<class From>(From &&from) -> To requires requires { static_cast<To>(std::declval<From>()); } { return static_cast<To>(std::forward<From>(from)); }; struct Test { bool value; constexpr Test(const std::string_view input) { const std::vector<std::string_view> lines = input | std::views::split('\n') | std::views::transform(static_caster<std::string_view>) | std::ranges::to<std::vector>(); // const std::string_view line = lines.at(0); for (const std::string_view line : lines) { const std::vector<std::string_view> line_tokens = line | std::views::split(' ') | std::views::transform(static_caster<std::string_view>) | std::ranges::to<std::vector>(); const std::string_view kind = line_tokens.at(0); this->value = "v" == kind; } } }; int main(int argc, char *argv[]) { constexpr bool value = Test("v 1.0 2.0 3.0\n"sv).value; std::cout << value; return 0; } 错误信息: In file included from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/vector:68, from <source>:4: /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/stl_vector.h: In function 'int main(int, char**)': <source>:33:52: in 'constexpr' expansion of 'Test(std::literals::string_view_literals::operator""sv(((const char*)"v 1.0 2.0 3.0\012"), 14))' <source>:26:57: in 'constexpr' expansion of 'line_tokens.std::vector<std::basic_string_view<char> >::at(0)' /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/stl_vector.h:1333:16: in 'constexpr' expansion of '((const std::vector<std::basic_string_view<char> >*)this)->std::vector<std::basic_string_view<char> >::_M_range_check(__n)' /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/stl_vector.h:1292:35: error: call to non-'constexpr' function 'void std::__throw_out_of_range_fmt(const char*, ...)' 1292 | __throw_out_of_range_fmt(__N("vector::_M_range_check: __n " | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | "(which is %zu) >= this->size() " | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1294 | "(which is %zu)"), | ~~~~~~~~~~~~~~~~~~ 1295 | __n, this->size()); | ~~~~~~~~~~~~~~~~~~ In file included from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/new_allocator.h:35, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/x86_64-linux-gnu/bits/c++allocator.h:33, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/allocator.h:46, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/string:45, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/locale_classes.h:42, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/ios_base.h:43, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/ios:46, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/ostream:42, from /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/iostream:43, from <source>:1: /opt/compiler-explorer/gcc-trunk-20241219/include/c++/15.0.0/bits/functexcept.h:82:3: note: 'void std::__throw_out_of_range_fmt(const char*, ...)' declared here 82 | __throw_out_of_range_fmt(const char*, ...) __attribute__((__noreturn__,__cold__)) | ^~~~~~~~~~~~~~~~~~~~~~~~ 这个示例不起作用,但是带有内部 for 循环的示例仅将其内容与索引 0 处的固定行一起使用。 有趣的是,当我从常量中删除 \n 时,它就起作用了。 问题是为什么以及如何解决这个问题? 这个问题与花哨的 c++26 东西无关,它是一个简单(但很容易错过)的错误。如果您以 \n 结尾并在 \n 上拆分,您将得到一个空行。该空行将包含一个空标记。并且空字符串没有“第 0”元素。如果彼此之间有两个空格,也会出现该错误。 要解决此问题,您可以在转换为 std::views::filter([](auto&& x){return !x.empty();}) | 之前在两个循环中添加 vector 以过滤掉空字符串,因为它们不是标记。

回答 1 投票 0

修改 C++17 中 constexpr 函数中的全局变量

在C++17中,是否允许修改constexpr函数中的全局变量? #包括 全局整数 = 0; constexpr int Foo(bool arg) { 如果(参数){ 返回1; }

回答 2 投票 0

编译时变量的唯一哈希值

有没有什么方法可以在编译时为每个变量创建唯一的哈希值。 C++ 允许块作用域,这可能会在一个函数内产生相同的命名变量,所以我不能这样做: #定义宏(...

回答 1 投票 0

在 C++ 中使用 inline 和 constexpr

我正在为 FRC 机器人开发一个机器人程序,并且很好奇 inline 或 constexpr 或两者是否都适合声明常量。 内联 constexpr 双 PI = wpi::math::pi 内联

回答 1 投票 0

如何在 C++ 的编译时上下文中将值重新解释为字节

我正在尝试实现一个可以在编译时使用的哈希函数。为了实现这一点,我需要将一个值(例如,int 或 float)重新解释为其原始字节。但是,当使用编译时

回答 1 投票 0

在 constexpr 中连接 string_views

我正在尝试在 constexpr 中连接 string_views。 以下是我的代码的简化版本: #包括 #包括 使用命名空间 std::string_view_li...

回答 3 投票 0

静态变量的地址作为 constexpr

我明白为什么这不能编译: int main() { constexpr int i = 0; constexpr const int* ptr = &i; } 本地 var 地址在运行时评估(尽管可以在此解决)

回答 1 投票 0

constexpr 与 C 中内存泄漏的关系

我正在学习C,今天我写了一些代码将罗马数字转换为数字。 在我的程序中,我有一个 const int MAXWORTLEN = 16; int main() 内部,以及我有的布尔数组

回答 2 投票 0

C++14 constexpr 对 cppreference 的函数要求

cppreference 指出,直到 C++14,constexpr 函数必须满足以下要求: 函数体必须被删除或默认或仅包含以下内容: 空状态...

回答 1 投票 0

将 constexpr 引用绑定到不同类型的变量时出错

在C++中众所周知,初始化引用时,类型必须匹配。所以下面的代码片段会导致错误(全局范围内,下同): 无符号 i; int & p = i; // 错误 但是

回答 1 投票 0

关于C++中constexpr编译错误的问题,可能与类型转换有关

在C++中众所周知,初始化引用时,类型必须匹配。所以下面的代码片段会导致错误(全局范围内,下同): 无符号 i; int & p = i; 但有一个

回答 1 投票 0

如何强制程序员实例化模板?

这是一些模板 constexpr 函数。 模板 constexpr void function(); 我想强制程序员使用特定的模板参数实例化函数。 模板无效

回答 1 投票 0

使用 std::construct_at 进行复制来更改联合中的活动成员

可以使用 std::construct_at 复制前一个活动成员的值来更改联合中的活动成员吗? 这个最小的例子 #包括 constexpr int f() { 并集 U {

回答 1 投票 0

在C++11中sqrt定义为constexpr吗?

在 C++11 中,std::sqrt 定义为 constexpr,即它可以合法地从其他 constexpr 函数或在编译时上下文(如数组大小或模板参数)中使用吗? g++ 似乎允许它(usi...

回答 7 投票 0

constexpr 函数无法编译 gcc 10 后

我有以下代码片段: #包括 // 另一个接受 const char 数组引用的函数 模板 常量表达式 int anotherFunction(const char (&...

回答 1 投票 0

可以在编译时创建QString吗?

考虑下面的代码: 静态 constexpr QString FOO = QStringLiteral("foo"); // 编译错误,因为 QString 没有默认的析构函数。 我如何在编译时创建 QString!?是吗

回答 2 投票 0

带有“long double”的 constexpr 在 ppc64el 上失败

无论出于何种原因,powerpc64le 上的 gcc (g++ (Debian 14.2.0-7) 14.2.0) 无法计算具有长双除法的 constexpr: 无效测试(){ constexpr auto oneThird = ((long double) 1)/ ((long

回答 1 投票 0

如何实现 constexpr string_view 与数字的乘法

我想实现 string_view 乘以一个像 python ("{}"*8) 这样的数字,以便在 fmt::format 上更简单地表达格式字符串中有多少个“{}”。 但是下面的代码: ...

回答 3 投票 0

使用 constexpr 查找表

我正在创建一个坐标查找表,例如: int a[n][2] = {{0,1},{2,3}, ... } 对于给定的 n,在编译时创建。我开始研究 constexpr,但似乎......

回答 4 投票 0

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