constexpr是C ++ 11中引入的修饰符,它通知编译器函数或变量的值是已知的,或者可以在编译时计算。因此,它可以在不可能的地方用作常数。
constexpt指针如何存在并且constevel函数在编译时返回指针?
我正在浏览 constexpr 和 consteval 的主题,发现以下内容, 我们可以拥有 CONSTEXPR 类型的指针 CONSTEVAL 函数可以返回 CONSTEXPR 变量的指针 一个...
使用局部变量的引用来初始化 constexpr 变量是否有效?
以下代码只能在 GCC 上编译(在 godbolt.org 上检查了 10.4 和 13.2),但不能在 Clang 上编译(在我尝试过的所有版本上都失败,例如 godbolt.org 上的 17.1): 结构体A { 静态常量表达式...
这是我的工作代码示例: #包括 模板 B类{ 民众: 整数y; constexpr b(int x) : y(x) { } constexpr void sayhi() { 标准::
在 C++14 中初始化 std::array 类型的静态 constexpr 成员
我无法以编程方式初始化静态 constexpr std::array 成员。 这是我的问题的一个最小示例(因为简化尺寸已知并且很小,因此初始化可以是手动的......
c++ 将 std::source_location::function_name() 作为字符串文字模板参数传递
我有这段代码,它返回编译时由 __PRETTY_FUNCTION__ 宏提供的修改后的函数名称字符串: 模板 结构体SL { 字符值[N]; constexpr SL(const ch...
consteval:调用 consteval 函数 'encrypt_string' 不是常量表达式,指向临时子对象的指针不是常量表达式
我想使用 consteval 关键字在 C++ 中创建一个简单的字符串加密。以前,我使用 constexpr,它可以工作,但某些字符串在运行时被加密。所以,我决定改用
我正在尝试 C++20,以更好地了解它们在实践中的工作原理。我了解了模块:私有片段,可用于将接口与实现分开,而 k...
C++11:用另一个 constexpr char 数组初始化 constexpr char 数组
我想用另一个 constexpr char [] 成员初始化 constexpr char[] 成员。可以用C++11或以上版本实现吗? #包括 结构基{ static constexpr char Va...
如何初始化 std::pair 的 constexpr std::array <int, const char[]>?
在 C++14 中,如何初始化包含文本字符串的 std::pair 的全局 constexpr std::array?以下不起作用: #包括 constexpr std::array 在 C++14 中,如何初始化包含文本字符串的 std::array 的全局 constexpr std::pair?以下不起作用: #include <array> constexpr std::array<std::pair<int, const char[]>, 3> strings = { {0, "Int"}, {1, "Float"}, {2, "Bool"}}; 你就快到了。首先,char const[]类型需要是一个指针,因为它是一个不完整的类型,可能无法保存在std::pair中。其次,你缺少一对牙套。正确的声明将如下所示: constexpr std::array<std::pair<int, const char*>, 3> strings = {{ {0, "Int"}, {1, "Float"}, {2, "Bool"}, }}; 需要额外的大括号,因为 std::array 是保存原始 C 数组的聚合,因此我们需要显式提到的大括号,以便 {0, "Int"} 不会被错误地视为内部数组对象的初始化程序。 C++20 中的另一种选择是使用 std::to_array,它允许您创建一个不需要预先指定大小的数组。 constexpr auto strings = std::to_array<std::pair<int, const char*>>({ {0, "Int"}, {1, "Float"}, {2, "Bool"}, });
下面只是一个简单的程序来演示constexpr关键字的用法,这个关键字在涉及constexpr时经常使用。为什么我们要把它写得很长,而不只是把输出数字......
以下 constexpr 函数无法编译: constexpr 无效 fnc() { constexpr int i = 5; constexpr 自动 ptr = &i; } 考虑到所有评估,为什么 ptr 不能为 constexpr
#包括 #包括 constexpr auto fx = [] (std::string msg) { 返回消息+“! ”; }; int main(int argc, char* argv[]) { if (argc == 2) std::cout << "h...
尝试创建具有 constexpr 属性的结构成员而不是静态会导致编译器错误(见下文)。这是为什么?对于单个常量值,我会将这个值存储在内存中...
为什么这个 constexpr 静态成员函数在调用时不被视为 constexpr?
为什么这个constexpr静态成员函数,由//!标识不,评论,调用时没有被视为 constexpr? 结构 Item_id { 枚举 枚举 { 大小、位置、属性、window_...
结构Foo { 结构栏 { 整数数据=0; //constexpr Bar() = 默认; // 也不起作用 constexpr Bar() : 数据(0) {} }; static constexpr Bar bar = {}; //
结构Foo { 结构栏 { 整数数据=0; //constexpr Bar() = 默认; // 也不起作用 constexpr Bar() : 数据(0) {} }; static constexpr Bar bar = {}; //
我想创建一个静态分配 2^N 字节数组的结构,但我不希望该结构的用户指定这个大小作为指数。例子: 我的愚蠢数组 我想创建一个静态分配 2^N 字节数组的结构,但我不希望该结构的用户指定此大小作为指数。示例: my_stupid_array<char, 32> a1; // I want this! my_stupid_array<char, 5> a2; // And not this... 如何检查此模板参数是否为 2 的幂并通过一条不错的消息警告用户? 我已经能够使用一个简单的模板来检查这一点: template<int N> struct is_power_of_two { enum {val = (N >= 1) & !(N & (N - 1))}; }; 但是,我无法用理智的消息警告用户这一点。有什么想法吗? 编辑 修复了不明确的示例。 编辑 1确实是2的幂。解决了这个问题! :) 编辑 使用 BOOST_STATIC_ASSERT,我在使用 GCC 时收到此代码的编译错误: template<int N> struct is_power_of_two { enum {val = (N >= 1) & !(N & (N - 1))}; BOOST_STATIC_ASSERT(val); }; 错误 ..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' http://ideone.com/cMfEf 编辑 哦,我明白了。这是断言失败时我应该收到的消息。但这未能给用户一些理智的信息。 :( 这些天,有了 constexpr 和 一些小小的技巧,你就可以 constexpr bool is_powerof2(int v) { return v && ((v & (v - 1)) == 0); } static_assert 来救援(仅限 C++11,对于 C++03 取消注释 BOOST_STATIC_ASSERT): #include<iostream> // #include <boost/static_assert.hpp> template<int N> struct is_power_of_two { enum {val = N && !(N & (N - 1))}; static_assert(val, "should use a power of 2 as template parameter"); // BOOST_STATIC_ASSERT(val); // without C++11 support, won't take a string message }; int main() { std::cout << is_power_of_two<2>::val << "\n"; std::cout << is_power_of_two<3>::val << "\n"; } C++11 的 Ideone 输出 C++03 的 Ideone 输出 更新1:其他想法(我知道你不想要这个,但对于大指数来说要容易得多): template<int N> make_power_of_two { enum { val = 1 << N }; }; my_stupid_array<char, make_power_of_two<5>::val > a1; // size 2^5 = 32 更新2:根据@sehe在聊天中的评论,您也可以对constexpr功能执行此操作 constexpr bool is_power_of_two(int x) { return x && ((x & (x-1)) == 0); } 您可以使用 static_assert 提供错误消息: template<int N> struct is_power_of_two { static_assert((N > 1) & !(N & (N - 1)), "Template parameter must be a power of two."); }; 我知道这是一个老问题,但我想根据上面的答案(谢谢你顺便说一句!)提出我刚刚使用的另一个选项以及 c++20 概念: template<auto V> constexpr bool is_power_of_two = V && ((V & (V - 1)) == 0); template<class T, auto SIZE> requires is_power_of_two<SIZE> using my_stupid_array = std::array<T, SIZE>; my_stupid_array<char, 32> a1; // FINE my_stupid_array<char, 5> a1; // COMPILER ERROR
GCC 接受 `constexpr struct {} s;` 但 Clang 拒绝它。谁是正确的? [重复]
以下代码可以使用 GCC 正常编译: constexpr struct {} s; 但 Clang 拒绝了它,并出现以下错误: 错误:const 类型“const struct”对象的默认初始化(匿名
你好,我正在学习 C++11,我想知道如何制作 constexpr 0 到 n 数组,例如: n = 5; int array[] = {0 ... n}; 所以数组可能是 {0, 1, 2, 3, 4, 5}
我正在尝试编写一个函数“my_func()”,该函数在编译时计算字符串中“a”的字符数,这使得当计算“a&q...”时代码无法编译。