constexpr是C ++ 11中引入的修饰符,它通知编译器函数或变量的值是已知的,或者可以在编译时计算。因此,它可以在不可能的地方用作常数。
我有一些嵌入式 C 代码,我想要一个正弦值列表。我在 C++ 中使用 constexpr 函数做了类似的事情,该函数在主循环之外返回 std::array : #包括...
为什么 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 以过滤掉空字符串,因为它们不是标记。
在C++17中,是否允许修改constexpr函数中的全局变量? #包括 全局整数 = 0; constexpr int Foo(bool arg) { 如果(参数){ 返回1; }
有没有什么方法可以在编译时为每个变量创建唯一的哈希值。 C++ 允许块作用域,这可能会在一个函数内产生相同的命名变量,所以我不能这样做: #定义宏(...
我正在为 FRC 机器人开发一个机器人程序,并且很好奇 inline 或 constexpr 或两者是否都适合声明常量。 内联 constexpr 双 PI = wpi::math::pi 内联
我正在尝试实现一个可以在编译时使用的哈希函数。为了实现这一点,我需要将一个值(例如,int 或 float)重新解释为其原始字节。但是,当使用编译时
我正在尝试在 constexpr 中连接 string_views。 以下是我的代码的简化版本: #包括 #包括 使用命名空间 std::string_view_li...
我明白为什么这不能编译: int main() { constexpr int i = 0; constexpr const int* ptr = &i; } 本地 var 地址在运行时评估(尽管可以在此解决)
我正在学习C,今天我写了一些代码将罗马数字转换为数字。 在我的程序中,我有一个 const int MAXWORTLEN = 16; int main() 内部,以及我有的布尔数组
C++14 constexpr 对 cppreference 的函数要求
cppreference 指出,直到 C++14,constexpr 函数必须满足以下要求: 函数体必须被删除或默认或仅包含以下内容: 空状态...
在C++中众所周知,初始化引用时,类型必须匹配。所以下面的代码片段会导致错误(全局范围内,下同): 无符号 i; int & p = i; // 错误 但是
关于C++中constexpr编译错误的问题,可能与类型转换有关
在C++中众所周知,初始化引用时,类型必须匹配。所以下面的代码片段会导致错误(全局范围内,下同): 无符号 i; int & p = i; 但有一个
这是一些模板 constexpr 函数。 模板 constexpr void function(); 我想强制程序员使用特定的模板参数实例化函数。 模板无效
使用 std::construct_at 进行复制来更改联合中的活动成员
可以使用 std::construct_at 复制前一个活动成员的值来更改联合中的活动成员吗? 这个最小的例子 #包括 constexpr int f() { 并集 U {
在 C++11 中,std::sqrt 定义为 constexpr,即它可以合法地从其他 constexpr 函数或在编译时上下文(如数组大小或模板参数)中使用吗? g++ 似乎允许它(usi...
我有以下代码片段: #包括 // 另一个接受 const char 数组引用的函数 模板 常量表达式 int anotherFunction(const char (&...
考虑下面的代码: 静态 constexpr QString FOO = QStringLiteral("foo"); // 编译错误,因为 QString 没有默认的析构函数。 我如何在编译时创建 QString!?是吗
带有“long double”的 constexpr 在 ppc64el 上失败
无论出于何种原因,powerpc64le 上的 gcc (g++ (Debian 14.2.0-7) 14.2.0) 无法计算具有长双除法的 constexpr: 无效测试(){ constexpr auto oneThird = ((long double) 1)/ ((long
如何实现 constexpr string_view 与数字的乘法
我想实现 string_view 乘以一个像 python ("{}"*8) 这样的数字,以便在 fmt::format 上更简单地表达格式字符串中有多少个“{}”。 但是下面的代码: ...
我正在创建一个坐标查找表,例如: int a[n][2] = {{0,1},{2,3}, ... } 对于给定的 n,在编译时创建。我开始研究 constexpr,但似乎......